BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #87535同步于 2015/6/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

QT Creator 和Visual Studio,相同的程序,跑出了不同的结果

fyghost
2015/6/12镜像同步8 回复
RT,话说为什么啊?! 在一台电脑上,一个是VS2012, 一个是QT5.2.1,同样的源代码,原样的拷过来的,编译都是正常通过,在运行的时候却是VS出了正确的结果,而QT却是错误的结果。这是为什么啊? 用Qt是想着在Linux下也可以用qmake,不用写MakeFile,方便了很多。 最可气的是一开始Qt上程序还能正常工作,然后改动了一小部分,发现不行之后马上又改回去了,结果就再也出不来正确的输出了,真是让人理解不能啊。
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
gluowei机器人#1 · 2015/6/12
代码呢?
fyghost机器人#2 · 2015/6/12
我当时为什么要改动那一小部分,我简直就是脑抽
fyghost机器人#3 · 2015/6/12
代码太长了,5000多行,感觉贴了无意义啊。。。。 【 在 gluowei 的大作中提到: 】 : 代码呢?
fyghost机器人#4 · 2015/6/12
相比于对代码的分析,我更想知道为什么QT和VS的结果会有区别 【 在 gluowei 的大作中提到: 】 : 代码呢?
nuanyangyang机器人#5 · 2015/6/12
代码必然包含undefined behaviour,就是C++对结果没有任何规定,什么事都可能发生,从什么都不发生到机器冒烟都可能, 或者包含unspecified behaviour,就是C++规定几种可能的结果,发生任何一种结果都是可能的, 或者包含implementation-defined behaviour,其实就是一种undefined behaviour,但C++的标准建议具体的实现应该规定这些东西的行为,但不同的实现可以规定得不一样。 所以,既然C++里有这些东西,就不用奇怪同一个程序在不同的计算机、不同的操作系统、同一个操作系统不同的编译器、同一个编译器不同版本、同一个编译器同一个版本采用不同的优化级别、开启或者关闭调试,或者编译出来的同一个程序运行两次,的时候行为会不同。
fyghost机器人#6 · 2015/6/12
嗯,我只是对C++这种混乱的标准发下牢骚,一个程序想要跨编译器都很困难 【 在 nuanyangyang 的大作中提到: 】 : 代码必然包含undefined behaviour,就是C++对结果没有任何规定,什么事都可能发生,从什么都不发生到机器冒烟都可能, : 或者包含unspecified behaviour,就是C++规定几种可能的结果,发生任何一种结果都是可能的, : 或者包含implementation-defined behaviour,其实就是一种undefined behaviour,但C++的标准建议具体的实现应该规定这些东西的行为,但不同的实现可以规定得不一样。 : ...................
zf1992机器人#7 · 2015/6/12
潜水发现你好喜欢机器冒烟的样子~~[ema0][ema0] 【 在 nuanyangyang 的大作中提到: 】 : 代码必然包含undefined behaviour,就是C++对结果没有任何规定,什么事都可能发生,从什么都不发生到机器冒烟都可能, : 或者包含unspecified behaviour,就是C++规定几种可能的结果,发生任何一种结果都是可能的, : 或者包含implementation-defined behaviour,其实就是一种undefined behaviour,但C++的标准建议具体的实现应该规定这些东西的行为,但不同的实现可以规定得不一样。 : ...................
nuanyangyang机器人#8 · 2015/6/13
c语言的设计者也有苦衷。比如不同的机器,字长不一样,指针大小不一样,字节序不一样,对齐要求不一样,对多处理器并行的支持不一样,内存管理方式不一样,对非法内存读取的后果不一样,整数除以0的后果不一样,移位运算移动的位数超过字长的后果不一样。而且,对于错误的情况,处理错误是要付出代价的,比如对非法指针的读写,如果进行指针检查,那么所有正确的程序的速度都会变慢,而c的原则是信任程序员,所以读写非法指针的时候,干脆规定“什么都允许发生”。这就是为什么如果从函数返回局部变量的指针,有时候可以读出一些数据,但真正的语义是“未定义行为”,因为c语言并不要求插入指针检查。 其实想写可以跨平台的程序是可以的,只要保证只写有明确语义的程序,这样只要使用符合标准的编译器,结果都是可以预料的。 【 在 fyghost 的大作中提到: 】 : 嗯,我只是对C++这种混乱的标准发下牢骚,一个程序想要跨编译器都很困难 来自「北邮人论坛手机版」