我对此的理解如下。在 C 中,!
如果给定非零值,则运算符返回 0,如果给定 0,则返回非零值。
假设你有一小段 C 代码:
int y = 0;
int z = !y;
会有什么价值z
?它只是需要!0
为1吗?它依赖于系统吗?C标准是否规定了应该发生的事情?今晚早些时候,我在处理按位 2 的补码整数操作时遇到了这些问题。我有一个特定的问题要解决,但我有点摸不着头脑,为什么它会起作用。非常感谢您提供任何信息!
我对此的理解如下。在 C 中,!
如果给定非零值,则运算符返回 0,如果给定 0,则返回非零值。
假设你有一小段 C 代码:
int y = 0;
int z = !y;
会有什么价值z
?它只是需要!0
为1吗?它依赖于系统吗?C标准是否规定了应该发生的事情?今晚早些时候,我在处理按位 2 的补码整数操作时遇到了这些问题。我有一个特定的问题要解决,但我有点摸不着头脑,为什么它会起作用。非常感谢您提供任何信息!
C“生成”的真值始终为 0 或 1。
确实(呵呵)一个非零表达式通常被认为是“真”if
等等,但是当语言本身需要生成一个真值时,它使用 0 表示假,1 表示真。
由于!
运算符是逻辑运算符,所以它总是会产生 0 或 1。
因此,在您的情况下,z
将设置为 1。
更新:有关更多讨论,请参阅此常见问题解答条目,这就是我对“生成者”措辞的想法。令人惊讶的是,它甚至有相同的双关语(我在写答案之前没有查看此条目)。不确定这是否表明我有很好的幽默感。
!
带有运算符的一元表达式的结果是int
带值0
或1
。
逻辑否定运算符的结果!如果其操作数的值比较不等于 0,则为 0,如果其操作数的值比较等于 0,则为 1。结果的类型为 int。表达式 !E 等价于 (0==E)。
来自 C 标准 (n1124) 第 6.5.3.3 节。