我的一个朋友开玩笑地问我这个问题。它本来是一个"不用说"键入备注,但后来我实际上考虑了一段时间并开始提出一些聪明的" 几乎解决方案"。
首次尝试:
如果 C 支持量子计算,可能会有一个答案。一个q位可以同时处于许多状态,因此它可能是假的并且是真的,并且这个条件将返回
(BOOL)0.5
又名"是/否/可能 - " - 但是一旦你观察到变量,整个事物就会崩溃并再次失效。
第二次尝试:
如果X可以某种方式定义为随机二进制生成器并将其转换为BOOL,则有时可能会出错。我不确定你是否可以在 C 中执行此操作,除非您使用 CLANG 。
#define x (BOOL)!!(rand()%2)
我们讨论的语言是 C ,但我也很好奇是否有人能用任何语言找到任何解决方案。
答案 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
时有效