我对 C 语言中的一元运算符如何用于补码、逻辑非和预递增感到困惑。
Ones complement 像这样反对 0:
int main()
{
int a;
a = ~0; // Ones complement
printf("%d",a); // prints as -1.
}
逻辑否定像这样对 0 起作用:
int main()
{
int a;
a = !0; // Logical negation
printf("%d",a); // prints as 1.
}
但是对 0 的预增量会产生编译器错误:
int main()
{
int a;
a = ++0; //pre incrementing 0. error: non-lvalue in increment
printf("%d",a);
}
为什么这三个都不是一元运算符?
最佳答案
递增 (++
) 和递减 (--
) 运算符修改它们后面的内容。您不能修改文字或常量。相比之下,!
和 ~
运算符只是对一个值进行运算,它们不会将结果赋值给任何地方。
笼统地说,++n
表示n = n + 1; n
.也就是说,“获取 n
的值,将其加一,将该值写回 n
,并将新值作为表达式的值返回。”所以 ++0
意味着 0 = 0 + 1; 0
:“取 0
的值,将其加一,将其写回 0
,并返回新值作为表达式的结果。”字面量和常量不能是左手值(您不能分配给它们)。
相比之下,~n
表示“获取n
的值并对其应用按位非运算,将结果作为表达式的结果返回”。 n
不变,~
不会将更新后的值写回到它的操作数。
例如:
int n = 0;
int a;
a = ~n;
printf("a = %d, n = %d\n", a, n); // "a = -1, n = 0" -- `n` is unchanged
对比
int n = 0;
int a;
a = ++n;
printf("a = %d, n = %d\n", a, n); // "a = 1, n = 1" -- `n` is changed
递增 (++
) 和递减 (--
) 与 !
或 ~
(或者,我认为,任何其他一元运算符——至少,我无法立即想到任何其他修改其操作数的运算符)。
关于c - 一元运算符如何在 C 中工作,您不能预递增零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6502402/