1

我偶然发现了这个粘贴

int main() {
return!!!~!!!!!~!!!1??!??!1?

"^_^"  <:3

]:     "^.-"

<:      0.0 

<3  :>  ;}

一组可爱的表情符号,据称返回 null。有谁的 C-fu 比我更好的解释它是如何工作的吗?

4

3 回答 3

12

<:手段[:>手段](它们是有向图)。

??!意思是|(它是一个三元组),所以??!??!是合乎逻辑的||

?第一行的最后一个是条件运算符。

其余的从两个表情符号字符串之一中选择一个字符。它将从第一个中选择,因为无论有多少!~一开始就乱七八糟,anything || 1都是真的。

所以它实际上选择"^_^"[3]了 ,它是字符串末尾的 nul 终止符,即 0。

基本上代码读取return ((some mess) || 1) ? "^_^"[3] : "^.-"[1];,因为0.0 < 3是真的。

[编辑:我刚刚意识到(并在下面评论),可以编写一个~(expression equal to 0)具有未定义行为的符合实现。所以要知道这段代码是否严格符合,你必须检查两者都没有~应用于零。事实上!!!10,所以代码并不严格符合。不过,它适用于您可以命名的任何实现,因为几乎所有内容都使用 2 的补码。]

于 2013-04-04T10:47:31.957 回答
4

首先,用它们的规范形式替换三元组和替代标记:??!become |<:become[:>become ]

!!!~!!!!!~!!!1 || 1 ? "^_^"[3] : "^.-"[0.0<3]

第一部分<something> || 1评估为真。如果您愿意,您可以计算出!!!~!!!!!~!!!1评估结果,但这并不重要(只要定义了行为,如评论中所述)。所以条件运算符的结果是第一个分支,

"_^_"[3]

字符串文字有四个字符,最后一个是零终止符;所以整个表达式的值为零。

于 2013-04-04T10:54:19.333 回答
0

通过删除三元组和二元组(连同空格,并在三元运算符上添加括号),我们得到:

int main() { return !!!~!!!!!~!!!1||1?("^_^" [3]):"^.-"[0.0 <3]; }

现在我们需要做的就是删除不必要的额外内容......

于 2013-04-04T10:54:26.490 回答