我偶然发现了这个粘贴:
int main() {
return!!!~!!!!!~!!!1??!??!1?
"^_^" <:3
]: "^.-"
<: 0.0
<3 :> ;}
一组可爱的表情符号,据称返回 null。有谁的 C-fu 比我更好的解释它是如何工作的吗?
<:
手段[
,:>
手段]
(它们是有向图)。
??!
意思是|
(它是一个三元组),所以??!??!
是合乎逻辑的||
?
第一行的最后一个是条件运算符。
其余的从两个表情符号字符串之一中选择一个字符。它将从第一个中选择,因为无论有多少!
,~
一开始就乱七八糟,anything || 1
都是真的。
所以它实际上选择"^_^"[3]
了 ,它是字符串末尾的 nul 终止符,即 0。
基本上代码读取return ((some mess) || 1) ? "^_^"[3] : "^.-"[1];
,因为0.0 < 3
是真的。
[编辑:我刚刚意识到(并在下面评论),可以编写一个~(expression equal to 0)
具有未定义行为的符合实现。所以要知道这段代码是否严格符合,你必须检查两者都没有~
应用于零。事实上!!!1
是0
,所以代码并不严格符合。不过,它适用于您可以命名的任何实现,因为几乎所有内容都使用 2 的补码。]
首先,用它们的规范形式替换三元组和替代标记:??!
become |
、<:
become[
和:>
become ]
:
!!!~!!!!!~!!!1 || 1 ? "^_^"[3] : "^.-"[0.0<3]
第一部分<something> || 1
评估为真。如果您愿意,您可以计算出!!!~!!!!!~!!!1
评估结果,但这并不重要(只要定义了行为,如评论中所述)。所以条件运算符的结果是第一个分支,
"_^_"[3]
字符串文字有四个字符,最后一个是零终止符;所以整个表达式的值为零。
通过删除三元组和二元组(连同空格,并在三元运算符上添加括号),我们得到:
int main() { return !!!~!!!!!~!!!1||1?("^_^" [3]):"^.-"[0.0 <3]; }
现在我们需要做的就是删除不必要的额外内容......