对 c 中的 -(--a) 与 --(-a) 感到困惑
Posted
技术标签:
【中文标题】对 c 中的 -(--a) 与 --(-a) 感到困惑【英文标题】:Feeling confused with -(--a) vs --(-a) in c 【发布时间】:2015-02-27 16:49:58 【问题描述】:与 ++ 和 -- 运算符混淆
int a = 10;
printf("%d\n", -(--a) ); // valid
output: -9
但是,当使用以下时会出现问题:
printf("%d\n", --(-a)); // error, invalid
为什么?
【问题讨论】:
您似乎将 -(--a) 解释为具有一些神奇属性的字母序列。看看两者,写下每个表达式应该做什么,并且应该很明显为什么一个被允许而另一个不被允许。只需将“--”替换为“预减运算符”,将“-”替换为“一元减号”即可。 【参考方案1】:++
和 --
运算符仅适用于左值,不适用于值。左值是可以位于赋值左侧的东西。
printf("%d\n", -(--a) );
这里,--
运算符作用于变量a
,所以这是有效的。
但是,
printf("%d\n", --(-a));
这里,(-a)
返回一个值。 --
应用于无效的值。
这是因为--
修改了一个变量,而int
的值不能修改(比如7 = 5
不能做a = 5
可以做)
【讨论】:
不仅在变量上,而且在所谓的“左值”上(以允许在赋值左侧命名。例如--*expr
或--expr1[expr2]
,--expr->field
是允许的。跨度>
以上是关于对 c 中的 -(--a) 与 --(-a) 感到困惑的主要内容,如果未能解决你的问题,请参考以下文章