鱼C论坛

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

[已解决]++a

[复制链接]
发表于 2020-2-27 12:37:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 sssuhl 于 2020-2-27 12:37 编辑
  1. #include <stdio.h>

  2. int main ()
  3. {
  4.         int a;
  5.         a = 4;
  6.        
  7.         printf("%d", (++a)+(++a)+(++a));
  8.        
  9.         return 0;
  10. }
复制代码

为啥结果不是5+6+7=18?
最佳答案
2020-2-27 12:55:47
首先要明确一点: ++a这个表达式的计算结果就是+1之后的a, 而不是a+1的结果数值

b=(++a)+(++a)+(++a)

依据从左向右的顺序, 相当于b=((++a)+(++a))+(++a)

所以它的计算过程如下(这里就是"脱括号"的过程了, a=0)

b=(a+(++a))+(++a),           第一次脱括号的结果, 这时a=1

b=(a+a)+(++a),                  第二次脱括号的结果. 这时a=2

b=(2+2)+(++a),  

b=4+(++a)                         第三次脱括号的结果, 这时a=2

b=4+a                                第四次脱括号的结果, 这时a=3

b=4+3=7
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-27 12:40:44 | 显示全部楼层
++ -- 这类问题很复杂,不同的编译器会有不同的答案。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 12:49:39 | 显示全部楼层
这是 Dev-C++ 使用默认编译器的汇编程序:

  1.    0x0000000000401530 <+0>:        push   %rbp
  2.    0x0000000000401531 <+1>:        mov    %rsp,%rbp
  3.    0x0000000000401534 <+4>:        sub    $0x30,%rsp
  4.    0x0000000000401538 <+8>:        callq  0x402100 <__main>
  5.    0x000000000040153d <+13>:        movl   $0x4,-0x4(%rbp)
  6.    0x0000000000401544 <+20>:        addl   $0x1,-0x4(%rbp)
  7.    0x0000000000401548 <+24>:        addl   $0x1,-0x4(%rbp)
  8.    0x000000000040154c <+28>:        mov    -0x4(%rbp),%eax
  9.    0x000000000040154f <+31>:        lea    (%rax,%rax,1),%edx
  10.    0x0000000000401552 <+34>:        addl   $0x1,-0x4(%rbp)
  11.    0x0000000000401556 <+38>:        mov    -0x4(%rbp),%eax
  12.    0x0000000000401559 <+41>:        add    %edx,%eax
  13.    0x000000000040155b <+43>:        mov    %eax,%edx
  14.    0x000000000040155d <+45>:        lea    0x2a9c(%rip),%rcx        # 0x404000
  15.    0x0000000000401564 <+52>:        callq  0x402b18 <printf>
  16. => 0x0000000000401569 <+57>:        mov    $0x0,%eax
  17.    0x000000000040156e <+62>:        add    $0x30,%rsp
  18.    0x0000000000401572 <+66>:        pop    %rbp
  19.    0x0000000000401573 <+67>:        retq   
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 12:55:47 | 显示全部楼层    本楼为最佳答案   
首先要明确一点: ++a这个表达式的计算结果就是+1之后的a, 而不是a+1的结果数值

b=(++a)+(++a)+(++a)

依据从左向右的顺序, 相当于b=((++a)+(++a))+(++a)

所以它的计算过程如下(这里就是"脱括号"的过程了, a=0)

b=(a+(++a))+(++a),           第一次脱括号的结果, 这时a=1

b=(a+a)+(++a),                  第二次脱括号的结果. 这时a=2

b=(2+2)+(++a),  

b=4+(++a)                         第三次脱括号的结果, 这时a=2

b=4+a                                第四次脱括号的结果, 这时a=3

b=4+3=7
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 10:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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