2

我对一元运算符如何在 C 中用于补码、逻辑否定和预递增感到困惑。

一个补码对 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.
}

但是 Preincrement against 0 会产生编译器错误:

int main()
{
    int a;
    a = ++0;        //pre incrementing 0.  error: non-lvalue in increment
    printf("%d",a); 
}

考虑到它们都是一元运算符,为什么这三个都不工作?

4

3 回答 3

12

递增 ( ++) 和递减 ( --) 运算符修改后面的内容。您不能修改文字或常量。相比之下,!and~运算符仅对一个值进行操作,然后它们不会将结果分配到任何地方。

粗略地说,++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

增量 ( ++) 和减量 ( --) 只是在这种方式上与 for !or不同~(或者,我认为,任何其他一元运算符——至少,我无法立即想到任何其他修改其操作数的运算符)。

于 2011-06-28T06:27:06.547 回答
4

++并且--不只是将操作应用于值,它们会更改值本身。这种行为在文字上没有多大意义。

您引用的其他一元运算符 - 即~and !- 不会更改其操作数的值,它们只是对其值执行操作。

于 2011-06-28T06:27:23.913 回答
2

您正在尝试增加文字值。自操作 x++; 是 x=x+1 的同义词;这意味着您正在尝试为 0 设置一个新值,这不是一个变量。

于 2011-06-28T06:29:34.260 回答