关于x=i++和x=(i++)

2025-03-30 02:22:34
推荐回答(5个)
回答1:

按照C语言的标准,上面两句的意义不同。

假设i的初始值为i=5,那么前后两句中的x值分别为x=5,x=6


但是不同的编译器可能有不同的实现方法,也就是说不同的编译器们并不一定会得到相同的结果

不过像上面的这个问题,似乎所有的编译器都是按照C标准实现的,它们的结果应该是不同的


计算机内部分别是这么实现的:

1、x=i++

mov    ax,i    把i送入ax寄存器
mov    x,ax    把ax寄存器内容送入x变量
inc    ax      ax寄存器内容加1
mov    i,ax    把ax寄存器内容送入i变量

2、x=(i++)

mov    ax,i
inc    ax
mov    i,ax
mov    x,ax

回答2:

首先,你的括号并没有本质上改变运算式的性质。
编译器看到i++都是一样的操作:先将i的值从内存中取出来放入寄存器a,然后存入一个临时量中,接着再将i的值从内存中取出来放入寄存器b,寄存器b的值+1操作,然后将寄存器b的值写回内存中,即i中,你的赋值语句实际参与计算的是临时量。
所以并不是计算机内部设定,而是编译器这么设定的,而这些包括底层实现的汇编语言也是人设计的。

回答3:

这个是C语言,也是人类阅读的语言,翻译成汇编就知道了
int c = ++i;
012D1384 mov eax,dword ptr [i]
012D1387 add eax,1
012D138A mov dword ptr [i],eax
012D138D mov ecx,dword ptr [i]
012D1390 mov dword ptr [c],ecx
可以看到这个操作在完成了前三部之后做了两个mov把最终的i值放到了c中
再看看int b = i++;
012D1375 mov eax,dword ptr [i]
012D1378 mov dword ptr [b],eax
012D137B mov ecx,dword ptr [i]
012D137E add ecx,1
012D1381 mov dword ptr [i],ecx
结果稍有不同,在把i的值mov到eax之后又立即把eax放到了b中,随后的三步保持与之前一致只不过寄存器换成了ecx,正好符合i++的特性

回答4:

你的说法是错误的,两种写法都是先计算++运算符,再计算赋值运算符,因为++比=的优先级高

回答5: