C语言printf函数栈问题+自增自减操作符顺序

Ciel 发布于 2013/01/29 11:21
阅读 471
收藏 1

最近在复习C语言,有一小段程序实际Win7下的GCC结果和理论推断结果不符和,程序如下


#include <stdio.h>

int main()
{
    int i=8;
    printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
    return 0;
}


我推断的结果是:


8
7
7
8
-7
-8

实际GCC运行结果是:

8
8
7
8
-7
-8
第一和第二项涉及左边的自增自减运算符的时候,结果不符合预期,编译器为什么会先把运算全部做完了再一次输出呢?为什么这么算呢?


加载中
0
PYPlus
PYPlus
函数实参求值顺序是一种未规定行为.因为标准未提出任何要求,所以具体行为由标准的实现者实现,这样给了编译器发挥的空间,不要写这样代码.还有十十 一一表达式副作用
Ciel
Ciel
我刚刚查了一本老外的书,解释说自增自减都有副作用,会改变原变量的值,如果同时引用或者传递变量就会发生未定义行为,导致不确定性的编译代码。而且,++i和i++的“之前”、“之后”序列点定义不保证是马上体现的,尤其当它和其他操作混合时。也就是说,其实这样的代码本身就是不正确的。对吗?
0
PYPlus
PYPlus
这个是未规定行为 即unspecified behavior,标准未提出任何要求的且是正确的程序构件或数据的行为. 标准并未规定参数传入顺序是从左到右还是从右到左 还有你这个自增自减有副作用
0
四彩

又一个被谭书毒害的!!

0
晃心竹
晃心竹
这种东西害人啊
0
jingweiyoung
jingweiyoung
我当初就被这些测试题整的头都要晕了...现在想想,可以把注意力集中在更需要的地方,这些貌似有点浪费时间的,而且写代码也不要这样写。(个人建议)
返回顶部
顶部