按照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
首先,你的括号并没有本质上改变运算式的性质。
编译器看到i++都是一样的操作:先将i的值从内存中取出来放入寄存器a,然后存入一个临时量中,接着再将i的值从内存中取出来放入寄存器b,寄存器b的值+1操作,然后将寄存器b的值写回内存中,即i中,你的赋值语句实际参与计算的是临时量。
所以并不是计算机内部设定,而是编译器这么设定的,而这些包括底层实现的汇编语言也是人设计的。
这个是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++的特性
你的说法是错误的,两种写法都是先计算++运算符,再计算赋值运算符,因为++比=的优先级高