初学者求解答
#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 不明白其他三个 i 和 j 最终都是自增3次,当然都为8
置于q,大概如下:
q=((++j)+(++j))+(++j)
j是前置++,初始为5,先运算两个,j变成7,得
q=(7+7)+(++j) == 14+8 ==22 BngThea 发表于 2018-7-26 13:12
i 和 j 最终都是自增3次,当然都为8
置于q,大概如下:
q=((++j)+(++j))+(++j)
不应该是6+7+8吗 yxl015 发表于 2018-7-26 13:49
不应该是6+7+8吗
++是前置,先执行再求和 BngThea 发表于 2018-7-26 13:52
++是前置,先执行再求和
那样的话不应该是都先变成8在求和吗 新手问题多 麻烦了
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;
}
yxl015 发表于 2018-7-26 13:57
那样的话不应该是都先变成8在求和吗 新手问题多 麻烦了
就如6楼所示,每种编译器翻译的结果都可能不同 人造人 发表于 2018-7-26 14:00
也就是说,我的编译器是这样做的
谢谢谢谢 BngThea 发表于 2018-7-26 15:22
就如6楼所示,每种编译器翻译的结果都可能不同
好的 谢谢
页:
[1]