1) 我已经读过很多次关于 C 中未定义行为的内容。也就是说:C 在其定义中没有提及的一些行为,因此每个编译器都会有其实现,但不会违反 C 标准。示例为:x=++y*4+++y*3
。
但是,这里有人可以给我两个给出不同结果的编译器吗?我有兴趣用它进行测试。 (在我的机器上,我只有 mingw)
2) 并且,C 没有说明 + - */
操作的顺序。例如:1*2 + 3 + 4*5
。 */
将首先计算,但我们不知道它的另一个。
根据下面的例子:如果我们有:
int a, b, c;
// assign value for a,b,c
float result = a*b/c; // wrong
float result = (float)a*b/c; // seem true
但是,b/c
仍然可以先计算,所以答案会是错误的。所以,真正的类型转换应该是:
浮点结果 = a*b/(float)c
但是,几乎所有关于 C 语言的书籍,所有编写 C 语言的人,都总是使用: (float)a*b/c
。这是否总是正确的,或者他们相信“普通编译器”会像我们通常认为的那样从左到右解决?
请让我更清楚地了解这一点。
谢谢:)
最佳答案
对于1)你混淆了未定义的行为和未指定的行为,它们是不一样的。 你给出的这个丑陋的表达有未定义的行为;您认为未定义行为的后果只是非特定行为,即编译器选择了不同的可能性之一,这通常是您可以忍受的。
未定义的行为可能会更糟糕。如果行为未定义,编译器通常可以选择任何它喜欢的东西,吃你的午餐,清空你的银行帐户,让你的计算机崩溃。不幸的是,在某些情况下,编译器会做出你意想不到的坏事。所以一开始就不要激怒UB。
关于C:未定义的行为事实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401627/