在阅读关于控制主题的答案到达非空函数的结尾之后,我没有看到任何答案,具体说明了使用空{退出非空函数的情况{1}}陈述:
return
到目前为止我在C standard中找到的是:
6.8.6.4返回声明
约束
- 带有表达式的
醇>int return_integer() { return; } // empty return in non-void function
语句不应出现在返回类型为return
的函数中。没有表达式的void
语句只能出现在返回类型为return
的函数中。
标准引用说明我们对void
和非return
函数的void
语句执行的应该,当我们忽略约束时会发生什么在文件的其他部分提到:
6.9.1函数定义
- 如果到达了终止函数的
醇>void
,并且调用者使用了函数调用的值,则行为未定义。
之前的标准引用声明,如果我们使用函数的返回值,并且在到达结束花括号(}
)之后结束,则会发生UB,所以我们在下面的代码中有UB:
}
在int UB(int x) { if (x) return x; }
printf("%d", UB(1)); // Correct
printf("%d", UB(0)); // Undefined behavior
调用中,函数通过UB(1)
下的1
指令返回return x;
;在if (x)
调用中,UB(0)
条件未通过,因此函数结束到达if (x)
,在这种情况下使用返回值为UB(但不是}
})。但是,在这种情况下会发生什么?
UB(1)
在上面的代码中,调用int UB(int x) { if (x) return; } // empty return statement
printf("%d", UB(1)); // Undefined behavior?
printf("%d", UB(0)); // Undefined behavior
不符合导致UB的UB(1)
要求,因为该功能在没有到达§6.9.1/12
的情况下结束不回报任何价值。
C标准的哪个部分描述了这种情况?
答案 0 :(得分:3)
int UB(int x) { if (x) return; }
这甚至不是未定义的行为,它是约束违规。引用的文字
来自6.8.6.4的没有表达式的return语句只能出现在 返回类型为void的函数
是规范性的,这意味着不允许编译器在没有给出诊断消息的情况下让它滑动。如果在没有给出诊断的情况下进行编译,则编译器不是符合标准的实现(不符合语言标准)。
简单来说,这意味着:代码甚至不应该编译。
现在,如果编译器确实产生了二进制可执行文件,即使代码具有约束违规,所有的投注都会被关闭。它不再是C程序,而是一些非标准程序,没有任何语言标准的保证行为。