c语言练习生 发表于 2021-1-14 16:19:08

新手路过

intj=5;
q=(++j)+(++j)+(++j)求q的值。这一串是怎么算的,为什么结果是24呢?
(不是写代码,只是单纯想问怎么算的)。

心驰神往 发表于 2021-1-14 16:22:11

这个问题你可以看下这个https://fishc.com.cn/forum.php?mod=viewthread&tid=188583#pid5187354
我用的Dev结果是22

jackz007 发表于 2021-1-14 17:40:01

         24 说明使用的编译器是 VC,估计是先完成 3 个 ++ j,使 j 由 5 变成 8,然后,3 个 8 相加不就是 24 了?

jackz007 发表于 2021-1-14 18:09:18

本帖最后由 jackz007 于 2021-1-14 18:39 编辑

      使用 gcc 编译这个代码
#include <stdio.h>

int main(void)
{
      int j = 5 , q                ;
      q = (++ j) + (++ j) + (++ j) ;
      printf("%d\n" , q)         ;
}
       运行结果是 22,非常的怪异,为了搞清楚这个值的来历,我用 OD 对可执行程序的反汇编代码进行了静态分析
00401360/$55                         push    ebp
00401361|.89E5                     mov   ebp, esp
00401363|.83E4 F0                  and   esp, 0xFFFFFFF0
00401366|.83EC 20                  sub   esp, 0x20
00401369|.E8 A2050000                call    00401910
0040136E|.C74424 1C 05000000         mov   dword ptr , 0x5                     ; j = 5
00401376|.834424 1C 01               add   dword ptr , 0x1                     ; j = j + 1 = 6
0040137B|.834424 1C 01               add   dword ptr , 0x1                     ; j = j + 1 = 7
00401380|.8B4424 1C                  mov   eax, dword ptr                      ;
00401384|.8D1400                     lea   edx, dword ptr                       ; i = j + j = 14
00401387|.834424 1C 01               add   dword ptr , 0x1                     ; j = j + 1 = 8
0040138C|.8B4424 1C                  mov   eax, dword ptr                      ;
00401390|.01D0                     add   eax, edx                                    ; q = j + i = 8 + 14 = 22
00401392|.894424 18                  mov   dword ptr , eax                     ; |
00401396|.8B4424 18                  mov   eax, dword ptr                      ; |
0040139A|.894424 04                  mov   dword ptr , eax                      ; |
0040139E|.C70424 00504000            mov   dword ptr , 00405000                     ; |ASCII "%d\n"
004013A5|.E8 66270000                call    <jmp.&msvcrt.printf>                        ; \printf
004013AA|.B8 00000000                mov   eax, 0x0
004013AF|.C9                         leave
004013B0\.C3                         retn

      上面的汇编代码我已经做了注释。
      我们看到,代码执行细节用 C 语言描述过程是这样的:
      int i , j = 5 , q ;
      j ++            ;
      j ++            ;
      i = j + j         ;
      j ++            ;
      q = j + i         ;
      这就是 22 的来历。

WindyJane 发表于 2021-1-14 22:20:43

jackz007 发表于 2021-1-14 18:09
使用 gcc 编译这个代码

       运行结果是 22,非常的怪异,为了搞清楚这个值的来历,我用 OD 对 ...

向大佬看齐!{:10_275:}

405794672 发表于 2021-1-15 19:04:08

编译器对待不同。VS编译器按++在前则先自增来算。所以J自增了三次,然后才进行其它运算
页: [1]
查看完整版本: 新手路过