yxl015 发表于 2018-7-26 12:41:05

初学者求解答

#include <stdio.h>


void main()
{
    int i = 5,j=5,p,q;
    p=(i++)+(i++)+(i++);
    q=(++j)+(++j)+(++j);
    printf("%d,%d,%d,%d",i,j,p,q);
}

答案分别是 8 8 15 22   

明白为什么是15 不明白其他三个

BngThea 发表于 2018-7-26 13:12:11

i 和 j 最终都是自增3次,当然都为8
置于q,大概如下:
q=((++j)+(++j))+(++j)
j是前置++,初始为5,先运算两个,j变成7,得
q=(7+7)+(++j) == 14+8 ==22

yxl015 发表于 2018-7-26 13:49:39

BngThea 发表于 2018-7-26 13:12
i 和 j 最终都是自增3次,当然都为8
置于q,大概如下:
q=((++j)+(++j))+(++j)


不应该是6+7+8吗

BngThea 发表于 2018-7-26 13:52:10

yxl015 发表于 2018-7-26 13:49
不应该是6+7+8吗

++是前置,先执行再求和

yxl015 发表于 2018-7-26 13:57:02

BngThea 发表于 2018-7-26 13:52
++是前置,先执行再求和

那样的话不应该是都先变成8在求和吗 新手问题多 麻烦了

人造人 发表于 2018-7-26 14:00:32




        int i = 5, j = 5, p, q;
01014D3E C7 45 F8 05 00 00 00 mov         dword ptr ,5
01014D45 C7 45 EC 05 00 00 00 mov         dword ptr ,5
        p = (i++) + (i++) + (i++);
01014D4C 8B 45 F8             mov         eax,dword ptr
01014D4F 03 45 F8             add         eax,dword ptr
01014D52 03 45 F8             add         eax,dword ptr
01014D55 89 45 E0             mov         dword ptr ,eax
01014D58 8B 4D F8             mov         ecx,dword ptr
01014D5B 83 C1 01             add         ecx,1
01014D5E 89 4D F8             mov         dword ptr ,ecx
01014D61 8B 55 F8             mov         edx,dword ptr
01014D64 83 C2 01             add         edx,1
01014D67 89 55 F8             mov         dword ptr ,edx
01014D6A 8B 45 F8             mov         eax,dword ptr
01014D6D 83 C0 01             add         eax,1
01014D70 89 45 F8             mov         dword ptr ,eax
        q = (++j) + (++j) + (++j);
01014D73 8B 45 EC             mov         eax,dword ptr
01014D76 83 C0 01             add         eax,1
01014D79 89 45 EC             mov         dword ptr ,eax
01014D7C 8B 4D EC             mov         ecx,dword ptr
01014D7F 83 C1 01             add         ecx,1
01014D82 89 4D EC             mov         dword ptr ,ecx
01014D85 8B 55 EC             mov         edx,dword ptr
01014D88 83 C2 01             add         edx,1
01014D8B 89 55 EC             mov         dword ptr ,edx
01014D8E 8B 45 EC             mov         eax,dword ptr
01014D91 03 45 EC             add         eax,dword ptr
01014D94 03 45 EC             add         eax,dword ptr
01014D97 89 45 D4             mov         dword ptr ,eax

也就是说,我的编译器是这样做的
p = i + i + i;
i += 1;
i += 1;
i += 1;

j += 1;
j += 1;
j += 1;
q = j + j + j;



#include <stdio.h>

int main(void)
{
        {
                int i = 5, j = 5, p, q;
                p = (i++) + (i++) + (i++);
                q = (++j) + (++j) + (++j);
                printf("%d,%d,%d,%d\n", i, j, p, q);
        }
        {
                int i = 5, j = 5, p, q;
               
                p = i + i + i;
                i += 1;
                i += 1;
                i += 1;

                j += 1;
                j += 1;
                j += 1;
                q = j + j + j;

                printf("%d,%d,%d,%d\n", i, j, p, q);
        }

        return 0;
}




#include <stdio.h>

int main(void)
{
        int i = 5, j = 5, p, q;
        p = (i++) + (i++) + (i++);
        q = (++j) + (++j) + (++j);
        printf("%d,%d,%d,%d", i, j, p, q);

        return 0;
}

BngThea 发表于 2018-7-26 15:22:17

yxl015 发表于 2018-7-26 13:57
那样的话不应该是都先变成8在求和吗 新手问题多 麻烦了

就如6楼所示,每种编译器翻译的结果都可能不同

yxl015 发表于 2018-7-26 17:13:52

人造人 发表于 2018-7-26 14:00
也就是说,我的编译器是这样做的

谢谢谢谢

yxl015 发表于 2018-7-26 17:15:19

BngThea 发表于 2018-7-26 15:22
就如6楼所示,每种编译器翻译的结果都可能不同

好的 谢谢
页: [1]
查看完整版本: 初学者求解答