Oli*_*rth 8 c initialization undefined-behavior
基本上,这是未定义的结果吗?
int x;
int y = 1 || x;
Run Code Online (Sandbox Code Playgroud)
这里有两个"常识"论点:
x,价值都y应该是1.x无论如何都从未进行过评估.但反驳的是,我们有一个表达涉及一个未初始化的变量,所以所有的赌注都是关闭的(理论上).
更一般地说,如果未初始化变量的值不可能影响表达式的结果,那么它是否"安全"?例如:
int x;
int y = x - x;
Run Code Online (Sandbox Code Playgroud)
通常的免责声明:当然,我不是在提倡编写这样的代码.
在C中,使用具有自动存储持续时间的对象的值是不确定的行为,而它是不确定的.(J.2,提供信息)但是对于具有自动存储持续时间的变量来说,保持不确定的值是可以的.
表达式只能在计算时使用其值,并且根据6.5.12(逻辑OR运算符),如果第一个操作数将不等于0,则不计算第二个操作数(更不用说使用其值).
免责声明:我认为这个问题也适用于C++.显然它只适用于C语言.我不会说C-standardese,但我相信我的答案也适用于C,尽管使用不同的术语
int x;
int y = 1 || x;
Run Code Online (Sandbox Code Playgroud)
很明确,因为x根本没有被评估 - 保证||的短路评估.
int x;
int y = x - x;
Run Code Online (Sandbox Code Playgroud)
调用undefined behvior,因为x被计算并且发生了左值到右值的转换.如果没有进行转换,则行为将被明确定义,例如:
int x;
int* y = &x;
int z = &x - &x;
Run Code Online (Sandbox Code Playgroud)
这里也对x进行了求值,但没有进行左值到右值的转换,因此它被定义了.
| 归档时间: |
|
| 查看次数: |
356 次 |
| 最近记录: |