-1

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仍然可以先计算,所以答案是错误的。所以,真正的类型转换应该是:

float result = a*b/(float)c

但是,几乎所有关于 C 的书籍,所有编写 C 的人,总是使用 : (float)a*b/c。总是如此,还是他们相信“普通编译器”会像我们经常想的那样从左到右解决?

请让我更清楚地了解这一点。

谢谢 :)

4

2 回答 2

1

对于 1) 你混淆了未定义的行为和未指定的行为,它们是不一样的。您给出的这个丑陋的表达具有未定义的行为;您认为未定义行为的后果只是非特定行为,即编译器选择了不同的可能性之一,这通常是您可以忍受的。

未定义的行为可能会更糟。如果行为未定义,编译器通常可以根据自己的喜好选择任何东西,吃你的午餐,清空你的银行账户,让你的电脑崩溃。不幸的是,在某些情况下,编译器会做一些你在这些情况下没有预料到的坏事。所以一开始就不要激怒UB。

于 2012-07-09T20:02:45.963 回答
0

您不需要两个编译器即可从具有未定义行为的代码中获得不同的结果。在许多(如果不是大多数)情况下,如果您更改优化设置和/或修改周围代码,单个编译器会很乐意为您生成不同的结果。

于 2012-07-09T20:20:36.917 回答