编译器优化有时可以跳过对没有任何后果的某些语句的评估.但是,这也适用于逗号运算符吗?
以下代码在ideone上运行时没有任何错误,但我预计它会崩溃.
#include <iostream>
int main() {
int x = (1/0, 2);
std::cout << x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我将语句更改为,程序会崩溃 int x = 1/0;
编译器优化使用As-if规则.
as-if规则
允许任何和所有代码转换不会改变程序的可观察行为
是的,编译器可以对此进行优化.检查以下修改过的样本:
#include <iostream>
int main()
{
int y = 1;
int x = (y=1/0, 2);
std::cout << x << std::endl;
//std::cout << y << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
注释最后一行会在取消注释时正确编译并执行此代码,从而为您提供预期的未定义行为.
正如@jogojapan正确指出的那样,
重要的是要注意标准不保证编译器优化,并且除以零是未定义的行为.所以这段代码确实有一个未定义的行为.可观察行为是由于编译器优化除以零还是由于未定义的行为,我们永远无法知道.从技术上讲,它是未定义的行为.
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |