~0对!C中的0对1 我今天读了一些我认为是一个合理的程序员的代码,我注意到他们使用 A=~0 来设置一个循环退出变量。

~0对!C中的0对1 我今天读了一些我认为是一个合理的程序员的代码,我注意到他们使用 A=~0 来设置一个循环退出变量。,c,bit-manipulation,C,Bit Manipulation,除了简单地quit=1之外,还有什么令人信服的理由这样做吗 在我继续改变之前,我只是好奇而已。谢谢 例如: while(!quit){ ...; if(!strcmp(s, "q")) quit=~0; } ~0通常为-1,而!0被定义为1 当然,~0和!!0都是0,所以除了~0不是惯用语(这意味着人们不知道你到底在做什么)之外,没有充分的理由使用其中一个或另一个。没有充分的理由,除非其他一些代码测试以不同的方式退出,例如测试任何其他位!0是一个,但在所有现

除了简单地
quit=1之外,还有什么令人信服的理由这样做吗

在我继续改变之前,我只是好奇而已。谢谢

例如:

while(!quit){
    ...;

    if(!strcmp(s, "q")) 
        quit=~0;
}

~0
通常为-1,而
!0
被定义为1


当然,
~0和
!!0
都是0,所以除了
~0
不是惯用语(这意味着人们不知道你到底在做什么)之外,没有充分的理由使用其中一个或另一个。

没有充分的理由,除非其他一些代码测试
以不同的方式退出,例如测试任何其他位<代码>!0
是一个,但在所有现代体系结构中,
~0
是-1


在某些体系结构上~0比!0,尽管任何合适的编译器都应该对其进行优化。

在C中,~是一元运算符,用于将位翻转到相反的状态。因此,从技术上讲,代码是有效的,因为if()子句只计算0(false)或任何非0(true)的值。坦率地说,我认为这对于判断真假有点过分了。我只考虑使用它,如果我真的在按位进行评估。也许有人会对性能提出质疑,但我还是有点怀疑。

他们使用了
~=
还是
=~
?你们两个都在问题中写了哇,我的错:)他们用了=~0。我无意中写了另一封。谢谢Fixed.NP,我几乎肯定
~=
不是有效的运算符。@GWW:
~=
在C中无效,因为
~
是一个没有二进制等价物的一元运算符<但是,代码>~=
在Perl中很常见。退出的类型很重要。除非是无符号类型,否则此代码是伪造的。
~0
也不是获取非零值的可靠方法。它可以产生0,例如一个一个的补码机。@R:我用一个的补码机很多年了,它们真是讨厌透了。反转0也会设置所有位。你可能认为负零是否定的。永远不要问一个人的补码机器:“零和负零的区别是什么?”@ikegami:这很有意义,因为
~
是一个人的补码运算符。在补码机上,
-x
由位模式
~x
表示。因此
~0
0
(好吧,负零)。如果幸运的话——如果实现不支持负零,那么行为是未定义的。
~0
是实现定义的,可以是0或1。@R..:
~0
是一个整数,所有位都设置为1<代码>!0
定义为1,而
!(任何非0的项)
定义为0。唯一的方法是
~如果
~0==0
,则0可以是0。我无法想象一个体系结构会是这样。@Gabe:你缺乏想象力并不限制C标准。检查6.2.6.2整数可以是两个补码、一个补码或符号和幅值。在第二种情况下,所有一位都是零的第二种表示。@Gabe:如果OP正在读取任何注释,他现在知道了。通常的问题是,我们是按照标准编程,还是按照我们熟悉的一组实现编程。因为在这种情况下,代码必须是不可移植的,这是一个不需要动脑筋的问题:
1
作为一个真值更简单、更可移植,所以
~0
在两个方面都不如它。这还假设~0不是零,这在今天可能遇到的几乎任何计算机上都是如此,但并不是所有的C在过去都被使用过。