对 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) 感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

对python中的size()函数感到困惑。

对情节在线/离线/袖扣和不同版本感到困惑

对java属性文件位置感到困惑

C语言中的指针和内存泄漏

C中的语法理解:指针

对 C# 6.0 中的字符串插值感到困惑 [重复]