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

时间:2016-02-28 21:19:49

标签: c boolean logic conditional boolean-logic

我的一个朋友开玩笑地问我这个问题。它本来是一个"不用说"键入备注,但后来我实际上考虑了一段时间并开始提出一些聪明的" 几乎解决方案"。

首次尝试:

  

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

第二次尝试:

  

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

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

6 个答案:

答案 0 :(得分:16)

LoginViewModel易变(x)并被外部线程/设备修改时,表达式可以是 false

答案 1 :(得分:9)

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

#define x 1 ? 0 : 1
(x || !x)

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

(1 ? 0 : (1 || !1) ? 0 : 1)

答案 2 :(得分:4)

宏在这里真的是作弊,但你不需要与布尔类型或特殊编译器有任何关系。据我所知,以下是法定标准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;
}

或者更简洁:

int y = 0;
#define x y++

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

答案 3 :(得分:4)

更简单的宏:

#define x 0&0

展开(x || !x)(0 & 0 || !0 & 0),这总是假的。

类似地:

#define x 0*0
#define x 1*0  // for binary buffs
#define x 4&2  // for HHGG fans.

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

答案 4 :(得分:2)

如果x是charecter类型(即不是int或bool),那么像JS,PHP等语言会导致表达式为false。

表示类型转换错误

  

char x =&#34; string&#34 ;;

     

(x ||!x)= False(0或NaN)

他们支持良好类型转换的语言没有显示任何错误,或者可以通过自我强制删除此错误。

  

自我铸造char a =&#34; 10&#34 ;; int b =(int)a;

新版本。语言也包括batter cast engeine。

答案 5 :(得分:1)

在JS中试过:

var i = 0

i ++ || !(I ++)

注意:此解决方案仅在i = 0

时有效