返回信息流#include <stdio.h>
int main() {
int a;
for (a=2147483645; a<a+1; a++) {
printf("%d\n", a);
}
return 0;
}
当然,答案是“任何事都可以发生,从什么都不发生到机器冒烟都可以”。要不要真的用编译器编译一下,试试各种编译选项,比如-O0, -O3, -g等等,然后推测一下编译器是怎么想的?
这是一条镜像帖。来源:北邮人论坛 / cpp / #86629同步于 2015/4/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
你猜这个程序的实际运行结果是什么?
nuanyangyang
2015/4/14镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
隐约记得某个优化选项下编译器会认为循环变量不会溢出?
【 在 nuanyangyang 的大作中提到: 】
: [code=c]
: #include <stdio.h>
: int main() {
: ...................
有符号数溢出是未定义行为,编译的一个基本假设就是程序员永远不会使用未定义行为。 那么对于暖师姐给的程序,编译器有理由做出这样的优化:
a < a + 1 -> true
这是一类很关键的安全问题,有兴趣的可以看看SOSP‘13上的文章
Towards optimization-safe systems: analyzing the impact of undefined behavior