Alb*_*haw 8 c logic conditional boolean-logic boolean
我的一个朋友开玩笑地问我这个问题.它本来是一种"不言而喻"的类型评论,但后来我实际上考虑了一段时间并开始提出一些聪明的" 几乎解决方案".
第一次尝试:
如果C曾经支持量子计算,那么可能会有一个答案.一个q位可以同时处于许多状态,因此它可能是假的并且是真的,并且这个条件将返回
(BOOL)0.5
又名"是/否/可能 - " - 但是一旦你观察变量,整个事物将崩溃并再次变为无效.
第二次尝试:
如果X可以某种方式定义为随机二进制生成器并将其转换为BOOL,则可能会在某些时候出错.除非你使用CLANG,否则我不确定你是否可以在C中这样做.
#define x (BOOL)!!(rand()%2)
我们讨论的语言是C,但我也很好奇是否有人能找到任何语言的解决方案.
这是一个技巧,但以下解决方案也有效:
#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)
宏在这里确实很作弊,但您不需要与布尔类型或特殊编译器有任何关系。据我所知,以下是法律标准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)
(对于那些担心未定义行为的人,请注意 的左侧和右侧之间有一个序列点||
。)
一个更简单的宏:
#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 个字母的宏:(