编译器:Microsoft Visual C++ 2010 Express
main()
{
int a = 3;
int b;
b = -a++;
printf("%d\n", b);
}
运行的结果是-3
但是如果按照优先级和结合性的说法感觉无法解释
'++'的优先级和取反'-'优先级相同,结合性是右结合
-a++应该等价于-(a++)
应该是先++再取反,应该为-4
但实际结果却是-3
这里表面上看是先赋值再自增,感觉与右结合相矛盾
(希望有人能从汇编的角度解释一下b=-a++的过程)
(虽然知道前缀自增运算符是---先增后用,后缀自增运算符是---先用后增,但是从优先级和结合性的角度想不通)
还有类似的代码
main()
{
int a = 3;
int b;
b = a++;
printf("%d", b);
}
如果你的代码是 a=a++,这个方法跑多少次a的值是不变的。
因为a++操作变相等于下面几步:
1:int temp = a;
2: a = a+1;
3: return temp;
所以,如果你再用变量去接收a++的值,那么拥有等于a
不好意思再问一下
@蓝海人: 你这个2???
我用c模拟器写这段代码,输出的是0
@让我发会呆: 纳尼?
@让我发会呆: 是我机器的问题?
@让我发会呆: 我用的是Microsoft Visual C++ 2010 Express
@蓝海人: 这个是不是环境的问题,我也不太清楚了,你可以在网上试试在线编辑器,我的理解C、java这些语言应该差不多的,至于c++应该也不会有不同才对吧。
@让我发会呆: 的确是我 机器的问题
找了三个在线编译器,结果全是0
负号的优先级更高啊,b = -a++ 等价于 b = (-a)++吧
@蓝海人: 优先级相同
'++'的优先级和取反'-'优先级相同,结合性是右结合 ->对
-a++应该等价于-(a++)->对
应该是先++再取反->对,应该为-4->错
a=3时-(a++) 等于-3 因为(a++)的值为3.但这时这个表达式执行完后.a的值已经是4.
但对负号来说.他后面的表达式的值为3.所以等于-3
你的知识点缺漏在于: "表达式"和"表达式的值" 这2个知识点.
a++的值为3,a值为4
精辟!