木子李工 发表于 2021-3-3 21:42:01

为什么 printf("\r\n %d, %d, %d", i, i++, ++i);//i=0;l 会输出2,1,2呢

不上机的话,下面的程序分别会打印什么值你们可以搞清楚不,为什么呢?

      
        int i=0;
      printf("\r\n %d, %d, %d", i, i++, ++i);
      i=0;
      printf("\r\n %d", i);
      printf("\r\n %d", i++);
      printf("\r\n %d", ++i);

乙冗 发表于 2021-3-3 21:59:47

printf("\r\n %d, %d, %d", i, i++, ++i);

乙冗 发表于 2021-3-3 22:09:48

本帖最后由 乙冗 于 2021-3-3 22:21 编辑

先说下面的
      printf("\r\n %d", i);
      printf("\r\n %d", i++);
      printf("\r\n %d", ++i);
i++先将i返回给前面的式子,再加加,即输出0之后,i自增变成了1;
++i 先加加,把自增之后的值1返回给前面的式子;
(两者最后的结果都是自增1,只是时间不同)
printf("\r\n %d, %d, %d", i, i++, ++i);【但是这个我运行之后是1,1,1我懵了。。。。】
百度有一个类似的写了printf应该是从右往左执行的,++i先于printf执行,i++后于printf执行
这样的话,就是 先++i,i等于1,i++先把i值赋给前面输出,在printf执行完之后才++,但是之前已经输出了i,而此时i仍为1,输出结束后,i变为2

木子李工 发表于 2021-3-4 08:38:35

乙冗 发表于 2021-3-3 22:09
先说下面的

i++先将i返回给前面的式子,再加加,即输出0之后,i自增变成了1;


单独只输出一个i的我理解,输出0,0,2;

但是下面的语句
printf("\r\n %d, %d, %d", i, i++, ++i);
输出2,1,2我就不太理解了

乙冗 发表于 2021-3-4 14:47:03

木子李工 发表于 2021-3-4 08:38
单独只输出一个i的我理解,输出0,0,2;

但是下面的语句


我也懵了,用vs运行就是2,1,2;
而vc6.0显示结果是1,1,1{:10_266:}

木子李工 发表于 2021-3-4 16:21:45

乙冗 发表于 2021-3-4 14:47
我也懵了,用vs运行就是2,1,2;
而vc6.0显示结果是1,1,1

在网上查了一番资料,大概是有以下几种原因
1.printf 格式化输出时,入栈顺序是从右往左输出的,
2.不同的编译器会有不同的结果
3.尽量避免写这种会有歧义的代码

参考:
1.https://cn.bing.com/search?q=printf(%22%25d%22%2C+i%2B%2B)%3B&PC=U316&FORM=CHROMN
2.https://blog.csdn.net/u014644714/article/details/77688321
3.https://bbs.csdn.net/topics/360083660

乙冗 发表于 2021-3-4 21:55:08

木子李工 发表于 2021-3-4 16:21
在网上查了一番资料,大概是有以下几种原因
1.printf 格式化输出时,入栈顺序是从右往左输出的,
2.不 ...

嗯嗯,一般就考试能碰到这种。。。
页: [1]
查看完整版本: 为什么 printf("\r\n %d, %d, %d", i, i++, ++i);//i=0;l 会输出2,1,2呢