2011-04-08 101 views
3

我对此的理解如下。在C,如果它被赋予一个非零值,如果它被赋予返回一个非零值0关于C的问题!运营商

说当你有C代码这个小片段的!操作返回0:

int y = 0; 
int z = !y; 

什么样的价值会进入z?它只需要!0为1?它依赖于系统吗? C标准是否规定了应该发生的事情?在今天早些时候做一些家庭作业时,我遇到了这些问题,处理按位2的补码整数操作。我遇到了一些问题需要解决,但我有点摸不着头脑,因为为什么有效。非常感谢任何信息! C“所产生的”

+0

函数返回一个值。表达式被评估。一个表达式!是应用的最后一个运算符将评估为1或0. – 2011-04-08 11:59:10

+0

谁告诉你它返回“非零值,如果它给出0”?在这种情况下返回1。这是由语言明确定义的。 – 2011-04-08 13:28:26

+0

我可能混淆了自己,错误地认为,因为!对于任何非零值作为其操作数,它的计算结果为0,它也以某种方式反向应用。 – 2011-04-08 18:33:45

回答

8

真理值始终为0或1。

这是事实(HEH)在if非零表达通常被认为是“真”等,但是,当语言本身需要生成一个真值,它使用0代表假,1代表真。

由于!运营商是一个逻辑运算符,它总是会产生0或1

所以你的情况,z将被设置为1。

更新:更多见this FAQ entry讨论,这就是我对“由......产生”措辞的想法。令人惊讶的是,它甚至有相同的双关语(在写我的答案之前我没有看这个条目)。不知道这是否表明我有幽默感,或者没有。

+0

由C生成的“真值”始终为0或1.错误! “if(1234)'也是如此。真是任何非零值。 – Sadique 2011-04-08 11:49:36

+0

我认为'1234'在你的例子中并不是“由C生成”,意思就是放松*。 – 2011-04-08 11:51:04

+1

@Acme:重新阅读关于*“由...生成”的部分C * – 2011-04-08 11:51:33

4

运算符!的一元表达式的结果为int,其值为01

3

运算符逻辑否定 的结果!如果其操作数 的值不等于0,则为0,如果为 ,则其操作数的值将比较 等于0.结果的类型为int。表达式E相当于 (0 == E)。

来自C标准(n1124)第6.5.3.3节。

+0

感谢您的参考! – 2011-04-08 18:32:19