如何在C中切换int/_Bool

rih*_*iha 15 c int boolean toggle

假设我们有一个int与希望之间切换它0,并1在布尔时尚.我想到了以下几种可能性:

int value = 0; // May as well be 1

value = value == 0 ? 1 : 0;
value = (value + 1) % 2;
value = !value; // I was curious if that would do...
Run Code Online (Sandbox Code Playgroud)
  1. 第三个似乎有效.为什么?是谁决定!01
  2. 这些都有问题吗?
  3. 还有其他可能吗?例如按位运算符?
  4. 哪个提供最佳性能?
  5. 这些都是相同的_Bool(或bool来自stdbool.h)吗?如果没有,有什么区别?

编辑:很多有价值的信息很多很好的答案,谢谢!不幸的是,我只能接受一个.

Mic*_*urr 28

value = !value; 直接表达你想要做的事情,它完全符合你想要的定义.

使用该表达式.

来自C99 6.5.3.3/5"一元算术运算符":

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


oua*_*uah 11

第三个似乎有效.为什么?谁决定!0是1?

C标准保证!01.

还有其他可能吗?例如按位运算符?

是的,您可以使用异或运算符:

value ^= 1;

顺便说一句,我更喜欢这种方式, value = !value;因为关系和相等运算符可能导致分支,而位运算符通常不会.


Sco*_*and 6

value = 1 - value; // toggle from 0 to 1 ... or 1 to 0
                   // when you know initial value is either 0 or 1
Run Code Online (Sandbox Code Playgroud)