HoneyAhu 发表于 2020-3-5 18:05:06

i++求解

#include<stdio.h>
int main()
{
        int i;
        printf("%d %d %d",i=1,i+5,i++);
        return 0;
}
为什么输出是这样的呀

Mr丶张 发表于 2020-3-5 18:28:34

第四行的i没有定义吧

SHRS23 发表于 2020-3-5 19:07:02

这个问题出现过多次了,看这篇帖子里我的答案,在5楼

https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=155919&pid=4343099

4goodworld 发表于 2020-3-5 19:35:19

我用VC6.0看了下汇编代码
printf函数是从右往左进行操作的,你会发现int i 之后,你直接i++,还有i+5,你都没有对i初始化,当然各种值都有可能
27:         printf("%d %d %d",i=1,i+5,i++);
0040F4B8 8B 45 FC             mov         eax,dword ptr
0040F4BB 89 45 F8             mov         dword ptr ,eax
0040F4BE 8B 4D F8             mov         ecx,dword ptr
0040F4C1 51                   push      ecx
0040F4C2 8B 55 FC             mov         edx,dword ptr
0040F4C5 83 C2 05             add         edx,5
0040F4C8 52                   push      edx
0040F4C9 C7 45 FC 01 00 00 00 mov         dword ptr ,1
0040F4D0 8B 45 FC             mov         eax,dword ptr
0040F4D3 50                   push      eax
0040F4D4 68 AC 2F 42 00       push      offset string "%d %d %d" (00422fac)

major_lyu 发表于 2020-3-5 22:12:56

不懂就不要这么用。
就算是懂也不要这么写程序,这样写出来程序可读性差,过段时间自己都看不懂了,而且容易造成逻辑混乱。
++,--这种运算尽量不要用在特别复杂的表达式中。

帅帅的嘉爷 发表于 2020-3-6 10:48:44

最好是定义在外面,Printf是从右往左按照栈顺序来操作的

jzzc 发表于 2020-3-6 15:20:55

我运行了楼主的代码,打印的结果和你一样,下面来分析一下:1. int i;声明之后没有初始化,根据运行结果应该是将其自动初始化为0了。
2.printf函数是从右往左运算的,也就是说先算i++,由于i为0,所以i++的值也为0,但此时i == 1;
3.i + 5,当然就是1 + 5喽;
4.i = 1,其实你只写一个i也是一样的,也会打印1的{:10_264:};
5.重点来了,虽然printf()函数是从右往左运算的,但是它的打印顺序依然是从左往右哦,你可以理解为先把要打印的东西计算了一遍(从右往左),再按计算出的值按顺序从左往右打印出来,就会出现楼楼的结果啦{:10_297:}!!!

HoneyAhu 发表于 2020-3-6 16:03:38

major_lyu 发表于 2020-3-5 22:12
不懂就不要这么用。
就算是懂也不要这么写程序,这样写出来程序可读性差,过段时间自己都看不懂了,而且容 ...

就是突发奇想,试了一下,发现结果出乎我的意料{:10_269:}谢啦

HoneyAhu 发表于 2020-3-6 16:06:12

jzzc 发表于 2020-3-6 15:20
我运行了楼主的代码,打印的结果和你一样,下面来分析一下:1. int i;声明之后没有初始化,根据运行结果应 ...

明白明白,谢谢{:10_323:}
页: [1]
查看完整版本: i++求解