鱼C论坛

 找回密码
 立即注册
查看: 1150|回复: 3

[已解决]含有自增运算的输出

[复制链接]
发表于 2021-3-7 19:46:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. int i=8;
  2. printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
复制代码

输出结果为8,8,7,8,-7,-8。
按照结果的正负看,应该是从左到右依次输出的。但第一个为什么是8?
如果直接
  1. int i=8;
  2. printf("%d\n",++i);
复制代码

输出是9???
最佳答案
2021-3-7 21:34:53
建议看看这个
<font color="red">[已解决]</font>自增
https://fishc.com.cn/thread-155977-1-1.html
(出处: 鱼C论坛)
主要是编译器的原故,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-7 20:24:09 | 显示全部楼层
研究第一个问题没有必要
第二个是++i,i先加1再执行其他的,i++先执行运算,再+1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-7 21:34:53 | 显示全部楼层    本楼为最佳答案   
建议看看这个
<font color="red">[已解决]</font>自增
https://fishc.com.cn/thread-155977-1-1.html
(出处: 鱼C论坛)
主要是编译器的原故,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-7 22:32:15 | 显示全部楼层
本帖最后由 墙里秋千墙外荡 于 2021-3-7 22:48 编辑

不同的编译器对于printf()函数的解释不同,有的编zhi译器解释为从左到右执行,而有的则解释为从右到左执行。对于VC6.0就是解释成从右到左执行的。
但是这并不意味着在VC6.0下执行结果就是8,7,7,8,-7,-8,出于某方面的考虑VC6.0要执行多余两个++或--后才会改变变量的值,具体的可以看汇编代码(VC6.0生成)

  1. ; 4    :     int i=8;

  2.         mov        DWORD PTR _i$[ebp], 8
  3. ; 5    :         printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);

  4.         mov        eax, DWORD PTR _i$[ebp]
  5.         neg        eax
  6.         mov        DWORD PTR -8+[ebp], eax
  7.         mov        ecx, DWORD PTR -8+[ebp]
  8.         push        ecx
  9.         mov        edx, DWORD PTR _i$[ebp]
  10.         neg        edx
  11.         mov        DWORD PTR -12+[ebp], edx
  12.         mov        eax, DWORD PTR -12+[ebp]
  13.         push        eax
  14.         mov        ecx, DWORD PTR _i$[ebp]
  15.         mov        DWORD PTR -16+[ebp], ecx
  16.         mov        edx, DWORD PTR -16+[ebp]
  17.         push        edx
  18.         mov        eax, DWORD PTR _i$[ebp]
  19.         mov        DWORD PTR -20+[ebp], eax
  20.         mov        ecx, DWORD PTR -20+[ebp]
  21.         push        ecx
  22.         mov        edx, DWORD PTR _i$[ebp]
  23.         sub        edx, 1
  24.         mov        DWORD PTR _i$[ebp], edx
  25.         mov        eax, DWORD PTR _i$[ebp]
  26.         push        eax
  27.         mov        ecx, DWORD PTR _i$[ebp]
  28.         add        ecx, 1
  29.         mov        DWORD PTR _i$[ebp], ecx
  30.         mov        edx, DWORD PTR _i$[ebp]
  31.         push        edx
  32.         push        OFFSET FLAT:??_C@_0BD@PKOM@?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$CFd?6?$AA@ ; `string'
  33.         mov        eax, DWORD PTR _i$[ebp]
  34.         add        eax, 1
  35.         mov        DWORD PTR _i$[ebp], eax
  36.         mov        ecx, DWORD PTR _i$[ebp]
  37.         sub        ecx, 1
  38.         mov        DWORD PTR _i$[ebp], ecx
  39.         mov        edx, DWORD PTR _i$[ebp]
  40.         add        edx, 1
  41.         mov        DWORD PTR _i$[ebp], edx
  42.         mov        eax, DWORD PTR _i$[ebp]
  43.         sub        eax, 1
  44.         mov        DWORD PTR _i$[ebp], eax
  45.         call        _printf
  46.         add        esp, 28                                        ; 0000001cH
复制代码

所以编写程序的时候不要出现这种写法。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 21:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表