表达式的C评估似乎是矛盾的

时间:2019-05-02 13:27:30

标签: c gcc

我一直在进行C编程测验,那里有两个琐碎的问题,立即给我发出了警报。有关使用++作为后缀和前缀操作数的表达式求值的两个问题。这是编译器开始表现出“怪异”的地方。

第一次评估:程序的输出是什么?

int x=20,y=35;
x=y++ + x++;
y= ++y + ++x;
printf("%d %d\n",x,y);

自然地,对表达式x = y ++ + x ++的求值应为x = 35 + 20 = 55,然后y ++ = 36且x ++ =56。但是,此求值不会以此顺序进行。发生的情况是x = 35 + 20 = 55,y ++ = 36,但x ++ = 55不变。我的问题是:“应该将值更改为56吗?”

接下来,第y = ++ y + ++ x行的计算结果为:y = 37 + 56 = 93,这意味着++ y和++ x均有效,但是在测试中给出答案的情况下,x = 56 ,但是所有值都是57。当我使用Debian Linux编译代码时:

gcc -g Test.c -o t.o
./t.o

56 93

因此,输出表明x = 56。 我的朋友在Windows上使用DevC ++编译了相同的测试代码,并且x导致x = 57,这意味着在表达式中:x = y ++ + x ++;在为x分配55后,x ++进行了赋值:x =56。这就是测试答案,即在程序完成执行后x = 57。我还使用了freegbd在线编译器,该编译器给了我与Debian Linux相同的结果。

有人知道这种现象是怎么回事吗?事实是,我们都已经为实习和C测试​​做好了准备,所以这让我们感到非常困惑,如果我们遇到这样的问题,由于我们从gcc编译器获得了不同的验证,该如何回答? >

此外,这是另一个问题,其中x ++命令可以正常工作:

第二次评估:x,y,z的值是什么?

int x, y, z;
x = 3;
y = 2*x++;
z = 2*++x;

printf ("%d %d %d\n", x, y, z);

看前面的例子,其中x ++在表达式的求值完成后不对值x起作用,我认为这次也不行,但是我错了。发生的事情是我得到了结果:x = 5,y = 6和z = 10运行命令:

gcc -g Test.c -o t.o
./t.o
5 6 10

我尝试的第一件事是:

int x, y, z;
x = 3;
y = 0;
y = y++ + 2*(x++);
z =2*(++x);

printf ("%d %d %d\n", x, y, z);

结果是:5 6 10。 y ++无效,与第一个问题相同。现在x ++起作用了。

都没有:使用/删除括号,什么都没有...

我曾尝试在Linux上将优化与gcc一起使用-O,-O2,并尝试了许多其他方法,但没有帮助。

var ++唯一使var递增的工作是是否未为其分配自身,例如:

a = 5 + var++.

如果是这样,例如:

var = a + var++;

作为后缀的++操作数不适用于var。

有什么想法吗?我缺少什么,为什么同一个编译器给出不同的结果?

0 个答案:

没有答案