如果函数永远不会返回,则省略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