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