如果函数永远不会返回,则省略return语句是有效的

考虑一个可能永远不会退出的函数foo()

 int foo(int n) { if(n != 0) return n; else for(;;); /* intentional infinite loop */ return 0; /* (*) */ } 

省略最终的回报声明是否有效? 如果我遗漏最后的陈述,它会引起不确定的行为吗?

即使它没有返回语句也会返回,除非你使用返回值,否则没有UB。

您可以省略在无限循环之后的最后一个return语句。 但是你可能会收到编译警告,就像并非所有路径都在返回。 在函数中使用无限循环并不好。 保持一个条件来打破循环。

如果在那种情况下真的需要那个无限循环,那么之后的return语句就是死代码。 删除它不会是不确定的行为。

对于非void函数,根本没有return语句或者并非所有路径都有return语句是有效的。

例如:

 // This is a valid function definition. int foo(void) { } 

要么

 // This is a valid function definition. int bar(void) { if (printf("")) { exit(1); } return 0; } 

但是读取foo的返回值是未定义的行为。

 foo(); // OK int a = foo(); // Undefined behavior int b = bar(); // OK