是什么!C中的0?

是什么!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

我知道在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> > Bang-Talm(!)是C、C++和C语言中常见的逻辑非操作符,所以

这是基于被解释为正确或错误的语言特征。。。在更现代的语言中是这样的

!false == true
!true == false

参见关于真值表的定律…

C中的布尔/逻辑运算符需要产生0或1

根据ISO C99标准第6.5.3.3/5节:

逻辑求反运算符的结果
为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:这里没有“意见”。该行为在标准中有明确规定。
的这种行为运算符:“一元求反运算符
将非零或真操作数转换为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