增量wrt TCC,GCC

增量wrt TCC,GCC,c,increment,ansi-c,C,Increment,Ansi C,我正在跳过头文件并取消主… 代码1:- 输出:- TCC:-(是Borlands 3.0或DOS蓝色环境下的任何名称) 19 18 19=如何?5+7+7,如果是(肯定与GCC输出相比),为什么不是18? 18=6+6+6?(c)相当于 a++; c=a+a+a; a++; a++;)对吗? 为什么是1918?完全相同的代码有两个不同的值 GCC:- 19 19都是5+7+7?有道理。 现在,代码2:- int a = 5 , c ; c = ++a + ++a + ++a; a = 5; pr

我正在跳过头文件并取消主…
代码1:-

输出:-
TCC:-(是Borlands 3.0或DOS蓝色环境下的任何名称)
19 18
19=如何?5+7+7,如果是(肯定与GCC输出相比),为什么不是18?

18=6+6+6?(c)相当于
a++;
c=a+a+a;
a++;
a++;)对吗?
为什么是1918?完全相同的代码有两个不同的值
GCC:-
19
19都是5+7+7?有道理。

现在,代码2:-

int a = 5 , c ;
c = ++a + ++a + ++a;
a = 5;
printf("%d %d",++a + ++a + ++a, c);
_________________________________________________
TCC:-
24 24
24具有相同的逻辑8+8+8(c分配代码相当于
a++;
a++;
a++;
c=a+a+a;
)a=8

GCC:-
22
22 ? 怎样通过正常逻辑6+7+8=21,但输出22?

然后是6+8+8,如果是,如何执行?不同的编译器以各自的方式执行表达式。编译器执行带有优化的语句理想情况下,我们不应该比较编译器版本的行为,即TCC、GCC、Borland c等

根据优化技术,不同编译器的执行顺序可能会有所不同

参考答案:


从考试的角度来看,在这类可能相关的问题上,我们应该遵循教科书标准。这是(或至少,似乎是)与未定义的操作顺序有关。@Luke这有点相关,但我不会在函数调用“printf()”的两个参数之间更改“a”的值,“c”单独计算,然后“a”重置为5。因此,“c=a+++++a+a++;”的优化是可能的与函数调用wrt TCC中的“a++++++a+a++”优化不同(即使计算完全相同),因此有两个ans,即。18 19是否生成?是。。因为在执行第二个语句时,编译器可能在代码中采用了不同的顺序保持优化技术,而OP显示了未定义的行为。
int a = 5 , c ;
c = ++a + ++a + ++a;
a = 5;
printf("%d %d",++a + ++a + ++a, c);
_________________________________________________