首页新闻找找看学习计划

自增运算符++,的运算顺序问题

0
悬赏园豆:80 [已解决问题] 解决于 2019-02-15 12:39

编译器: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);

}

蓝海人的主页 蓝海人 | 初学一级 | 园豆:52
提问于:2019-02-14 17:57
< >
分享
最佳答案
0

如果你的代码是 a=a++,这个方法跑多少次a的值是不变的。
因为a++操作变相等于下面几步:
1:int temp = a;
2: a = a+1;
3: return temp;
所以,如果你再用变量去接收a++的值,那么拥有等于a

收获园豆:40
让我发会呆 | 老鸟四级 |园豆:2629 | 2019-02-14 18:34

不好意思再问一下

蓝海人 | 园豆:52 (初学一级) | 2019-02-17 11:02

@蓝海人: 你这个2???
我用c模拟器写这段代码,输出的是0

让我发会呆 | 园豆:2629 (老鸟四级) | 2019-02-17 11:40

@让我发会呆: 纳尼?

蓝海人 | 园豆:52 (初学一级) | 2019-02-17 11:40

@让我发会呆: 是我机器的问题?

蓝海人 | 园豆:52 (初学一级) | 2019-02-17 11:40

@让我发会呆: 我用的是Microsoft Visual C++ 2010 Express

蓝海人 | 园豆:52 (初学一级) | 2019-02-17 11:41

@蓝海人: 这个是不是环境的问题,我也不太清楚了,你可以在网上试试在线编辑器,我的理解C、java这些语言应该差不多的,至于c++应该也不会有不同才对吧。

让我发会呆 | 园豆:2629 (老鸟四级) | 2019-02-17 11:48

@让我发会呆: 的确是我 机器的问题
找了三个在线编译器,结果全是0

蓝海人 | 园豆:52 (初学一级) | 2019-02-17 11:59
其他回答(3)
0

负号的优先级更高啊,b = -a++ 等价于 b = (-a)++吧

jello chen | 园豆:7091 (大侠五级) | 2019-02-14 20:34

支持(0) 反对(1) 蓝海人 | 园豆:52 (初学一级) | 2019-02-14 20:35

@蓝海人: 优先级相同

支持(0) 反对(0) __kylong | 园豆:221 (菜鸟二级) | 2019-02-15 08:51
0

'++'的优先级和取反'-'优先级相同,结合性是右结合 ->对
-a++应该等价于-(a++)->对
应该是先++再取反->对,应该为-4->错
a=3时-(a++) 等于-3 因为(a++)的值为3.但这时这个表达式执行完后.a的值已经是4.
但对负号来说.他后面的表达式的值为3.所以等于-3
你的知识点缺漏在于: "表达式"和"表达式的值" 这2个知识点.

收获园豆:40
吴瑞祥 | 园豆:28675 (高人七级) | 2019-02-14 21:06
0

a++的值为3,a值为4

__kylong | 园豆:221 (菜鸟二级) | 2019-02-15 08:53

精辟!

支持(0) 反对(0) czd890 | 园豆:7463 (大侠五级) | 2019-02-15 12:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册