c - 一元运算符如何在 C 中工作,您不能预递增零

标签 c pre-increment unary-operator

我对 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/

相关文章:

c - increment , decrement , printf() 中的任务,为什么在 C 中以这种方式评估这些

java - Java 中前置和后缀 "++"运算符的语义

Bash operator++ 行为与常量有关

c - 一元减号等于 binop 减号吗?

我可以使用指针打印出 int 数组的数组,就像字符串数组一样吗?

c - 有没有C语言的设计工具?

c - 有没有办法在 GCC 二进制文字中进行分组?

c - 从内存加载检查证书

c++ - 一元 '*' 的无效类型参数(具有 'int' )数组中的最低元素

c - C 的一元 '&' 有什么作用?为什么它不适用于常量?