什么时候(x ||!x)假?

Alb*_*haw 8 c logic conditional boolean-logic boolean

我的一个朋友开玩笑地问我这个问题.它本来是一种"不言而喻"的类型评论,但后来我实际上考虑了一段时间并开始提出一些聪明的" 几乎解决方案".

第一次尝试:

如果C曾经支持量子计算,那么可能会有一个答案.一个q位可以同时处于许多状态,因此它可能是假的并且是真的,并且这个条件将返回(BOOL)0.5又名"是/否/可能 - " - 但是一旦你观察变量,整个事物将崩溃并再次变为无效.

第二次尝试:

如果X可以某种方式定义为随机二进制生成器并将其转换为BOOL,则可能会在某些时候出错.除非你使用CLANG,否则我不确定你是否可以在C中这样做.#define x (BOOL)!!(rand()%2)



我们讨论的语言是C,但我也很好奇是否有人能找到任何语言的解决方案.

Ami*_*mit 16

xvolatile(volatile int x)被外部线程/设备修改时,表达式可以为false.

  • @AlbertRenshaw你总是没问,你问*什么时候*. (2认同)

Dir*_*ann 9

这是一个技巧,但以下解决方案也有效:

#define x 1 ? 0 : 1
(x || !x)
Run Code Online (Sandbox Code Playgroud)

原因在于运算符优先级.预处理后(x || !x)解析为以下(添加括号以显示优先级):

(1 ? 0 : (1 || !1) ? 0 : 1)
Run Code Online (Sandbox Code Playgroud)

  • 你可以使它变得更简单:`#define x 1 && 0`甚至`#define x 1,0` (2认同)

Nat*_*dge 5

宏在这里确实很作弊,但您不需要与布尔类型或特殊编译器有任何关系。据我所知,以下是法律标准C。

#include <stdio.h>
int f(void) { 
  static int y = 0;
  if (y == 0) {
     y = 1;
     return 0;
  } else {
    return 1;
  }
} 

#define x f()

int main(void) {
  if (x || !x) {
    puts("It was true");
  } else {
    puts("It was false");
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

或者更简洁地说:

int y = 0;
#define x y++
Run Code Online (Sandbox Code Playgroud)

(对于那些担心未定义行为的人,请注意 的左侧和右侧之间有一个序列点||。)


chq*_*lie 5

一个更简单的宏:

#define x 0&0
Run Code Online (Sandbox Code Playgroud)

扩展(x || !x)给出(0 & 0 || !0 & 0)总是错误的。

相似地:

#define x 0*0
#define x 1*0  // for binary buffs
#define x 4&2  // for HHGG fans.
Run Code Online (Sandbox Code Playgroud)

我找不到 2 个字母的宏:(