如果我用一个常量表达式除以零,我的玩具编译器将崩溃:
int x = 1 / 0;
C和/或C ++标准是否允许这种行为?
仅仅存在1 / 0
不允许编译器崩溃。最多允许假定该表达式将永远不会被求值,因此,执行将永远不会到达给定的行。
如果保证可以对表达式进行求值,则该标准对程序或编译器没有任何要求。然后编译器可能崩溃。
在C11标准给出一个明确的例子中1 / 0
所定义的行为未评估的时候:
因此,在以下初始化中,
static int i = 2 || 1 / 0;
该表达式是值为1的有效整数常量表达式。
第6.6节脚注118。
C11标准的6.6节在“约束”下表示
- 常数表达式不得包含赋值,增量,减量,函数调用或逗号运算符,除非它们包含在未求值的子表达式中。
- 每个常量表达式的值都应等于其类型可表示值范围内的常量。
由于1/0在int可表示的值范围内未求得常数,因此1/0不是常数表达式。这是关于什么算作常量表达式的规则,例如关于在其中没有赋值的规则。您可以看到,至少对于C ++,Clang不会将1/0视为常量表达式:
prog.cc:3:18: error: constexpr variable 'x' must be initialized by a constant expression
constexpr int x = 1/ 0 ;
^ ~~~~
(x == 0) ? x : 1 / x
即使x为0且评估1 / x为UB也是完美定义的。如果(0 == 0) ? 0 : 1 / 0
是UB,那就是胡说八道。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句