• 赵岩松
    2021-12-19
    连续看到现在,受益良多,非常感谢!

    作者回复: 很高兴对你有帮助 : )

    
    1
  • dog_brother
    2022-02-07
    老师,我有个问题,尾递归优化的条件:递归调用语句必须作为函数返回前的最后一条语句。老师,我对这句话理解不是很深入,可以举一个不能使用尾递归优化的递归代码么?

    作者回复: 需要注意的是“递归调用语句必须作为函数返回前的最后一条语句”这个条件只是我们根据尾递归优化的原理,来为编译器能够进行优化所做的假设。而实际编译器是否可以通过其他方式做到“将函数递归调用优化为循环”,这个就属于编译器本身的能力范畴了。而之所以有这样的假设,是由于相较于函数的递归调用,循环只能够发生在同一个函数栈帧的环境中。因此,对于所有在函数返回前产生的中间变量值,实际上都无法被正常保存。而如果函数的正常执行依赖于这些中间结果,则尾递归优化将无法进行。比如这个例子: int factorial(int num) { if (num == 1 || num == 0) return 1; return num * factorial(num - 1); } 虽然其实现不满足尾递归优化的前提要求,但编译器却可在高优化等级下将它的实现由递归变为迭代。

    
    
  • zxk
    2022-01-20
    _Noreturn 也等价于 noreturn,方法声明该关键字则表示方法调用后不再返回,可用于声明一些异常退出的方法。 这个特性的主要目的在于提高方法的可读性,同时还能够借助编译器,提前检测出 unreachable 的代码。
    
    5
  • Luke
    2022-09-02 来自江苏
    1.尾递归优化其实就是编译器帮忙把递归改成了迭代,不过需要代码写的便于编译器去优化。递归函数的最后一条语句是其本身即可,这样的形式可以帮编译器确认本次调用结果不依赖函数内的中间结果。其实很好理解,迭代的写法里面,单次循环也不依赖于上次的循环结果。当然,现代编译器越来越强大了,写的差点也能优化成尾递归。 2.k&r的古老声明方式还真没有用过,倒是无参函数最好在入参部分指定void的写法经常用。结合c的历史和自己的经验,这一条主要是想给维护者明确的信号,没有手误,我确定这是无参函数。 3.跟上述同理,noreturn应该也是让外部明确本函数没有返回值,不要依赖于他的返回值,甚至如果有使用该函数返回值的语句,编译器也会给出error。
    共 1 条评论
    1
  • qinsi
    2021-12-19
    就是__attribute__((noreturn)),比如在一个有返回值的函数里调用了exit()之后程序就退出了,如果exit没有声明为noreturn的话编译器就会警告说调用了exit的函数没有返回值。在其他语言里noreturn通常被称为Never类型。
    
    1
  • Geek_00a01d
    2022-12-17 来自河南
    思考题 交作业 C11 中新引入了一个名为 _Noreturn 的关键字 ---- 顾名思义 应该是没有返回值吧 大部分返回值为void的函数执行到函数最后一行代码就会返回调用者,继续执行调用者的逻辑 使用__Noreturn貌似不会继续执行调用者的逻辑
    
    
  • 青鸟飞鱼
    2022-04-30
    这才是C语言,我以前学的真的是皮毛都不算。
    
    
  • 小杰
    2022-04-19
    https://docs.microsoft.com/zh-cn/cpp/c-language/noreturn?view=msvc-170。查看微软中文文档,得到的答案:_Noreturn 关键字在 C11 中引入。 它告知编译器,应用编译器的函数不返回调用方。使用 _Noreturn(或等效的 noreturn)的主要好处是在代码中明确函数的意向,便于将来的读者了解,以及检测意外产生的无法访问的代码。标记为 noreturn 的函数不应包括返回类型,因为它不会将值返回给调用方。 它应为 void。
    
    
  • Tokamak
    2022-04-11
    经过实验 int fib(int n, int acc) { if(n <= 1) return acc; int a = 10, b = 20; // 无用语句,用于测试尾递归 return fib(n - 1, acc * n); } 在O3优化等级下也可以进行尾递归优化。gcc可真厉害~
    
    
  • =
    2021-12-19
    使用_Noreturn声明的函数不会返回到调用它的函数中,若是在其中使用了return语句,会在编译时报错。
    
    