是什么!C中的0?
我知道在C语言中,if语句和比较FALSE=0,其他任何东西都等于true 因此,是什么!C中的0?,c,boolean,C,Boolean,我知道在C语言中,if语句和比较FALSE=0,其他任何东西都等于true 因此, int j = 40 int k = !j k == 0 // this is true 我的问题正好相反。什么事!0变成什么?1? int l = 0 int m = !l m == ? // what is m? 一般来说,是的,它会变成1。也就是说,即使这是有保证的行为(我不确定),我还是会认为依赖代码的代码非常糟糕。 你可以假设它是一个真值。我不会再假设任何东西了。< /P> < P> > Ba
int j = 40
int k = !j
k == 0 // this is true
我的问题正好相反。什么事!0变成什么?1?
int l = 0
int m = !l
m == ? // what is m?
一般来说,是的,它会变成1。也就是说,即使这是有保证的行为(我不确定),我还是会认为依赖代码的代码非常糟糕。 你可以假设它是一个真值。我不会再假设任何东西了。< /P> < P> > Bang-Talm(!)是C、C++和C语言中常见的逻辑非操作符,所以 这是基于被解释为正确或错误的语言特征。。。在更现代的语言中是这样的
!false == true
!true == false
参见关于真值表的定律…C中的布尔/逻辑运算符需要产生0或1 根据ISO C99标准第6.5.3.3/5节: 逻辑求反运算符的结果
如果其操作数的值比较不等于0,则代码>为0;如果其操作数的值比较等于0,则代码>为1
事实上,!!x
是一个常用的习惯用法,用于强制值为0或1(不过我个人更喜欢x!=0
)
另请参见。§6.5.3.3/5:“逻辑求反运算符的结果!如果其操作数的值比较不等于0,则为0;如果其操作数的值比较等于0,则为1。结果的类型为int。”
其他逻辑运算符(例如,&&
,|
)也总是产生0或1。!x
将扩展为(x==0)
因此:
- 如果x=0->
!x
从(0==0)
=TRUE(值1)中获取值
- 如果x=0->
!x
从(x==0)
=FALSE(值0)中获取值
@Josh K:完美的建议。我希望每个人都能先尝试一下,然后再询问他们实际得到的结果。@Josh K:因为它可能会因编译器/标准/一周中的某一天而有所不同(例如,如果它不是定义的行为,尽管在这种情况下显然是这样),因此,查看单个结果值可能无法准确反映在任何其他给定设置上的结果。在我当前的设备上不可能。我很难让我的C编译器工作——我想这是它自己的问题P@S.Lott:这里没有“意见”。该行为在标准中有明确规定。的这种行为《K&R第一版》第38页第2.6节中提到了代码>运算符:“一元求反运算符!
将非零或真操作数转换为0,将假操作数的零转换为1。”;总是。C中的布尔运算符必须返回0或1。不过,这感觉像是违背了代码的意图。一点也不。例如prefix=“-”+!阴性代码>是完全正常的C@R…:我以前没见过那个。如果neg为false,它将指向字符串末尾的空字节?比让前缀为45或0的字符,并让显示例程过滤掉空字节更有趣)。是的,如果neg
为false,那么prefix
指向空字符串。如果是真的,<代码>前缀 >指向字符串<代码>“->代码>(当然,不管是null终止)。实际上,在C++中,<代码>!code>接受一个bool
操作数并生成一个bool
结果——尽管为了向后兼容,有从bool
到int
的隐式转换,true
转换为1
和false
转换为0
,以及从其他整数类型转换为bool
,将0
转换为false
,并将任何其他值转换为true
。呼叫正确。看起来我们中的更多人需要真正阅读该死的ISO标准。+1用于指向标准,但代码使用代码>需要直接去垃圾桶。@mathepic:是的,C89也是如此(第6.3.3.3节)。@Billy ONeal:在我看来,说“flagvar=!!(multibitFlag&BIT_OF_INTEREST);”比“flagvar=((multibitFlag&BIT_OF_INTEREST)!=0”更清楚后一种格式的额外冗长有什么好处?@caf和@supercat:没有经验的C程序员有时会想
是一个不同的运算符(如&&
或| |
)并会混淆。我认为双重否定通常更难理解,而=代码>还要求人们理解它生成0或1,这似乎更简单,因为它只是一个操作,而不是两个。
!false == true
!true == false