【发布时间】:2014-10-19 03:25:22
【问题描述】:
一位同事给出的一个谜题,我无法弄清楚这个 C 程序实际上是如何编译和运行的。这个 >>>= 运算符和奇怪的 1P1 文字是什么?我已经在 Clang 和 GCC 中进行了测试。没有警告,输出为“???”
#include <stdio.h>
int main()
{
int a[2]={ 10, 1 };
while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
printf("?");
return 0;
}
【问题讨论】:
-
其中一些是digraphs。
-
@Kay,在这种情况下不: :> = ] 然后 a[...] >> = a[...]
-
@Marc 我不认为它可以是 ">> >=" 因为那不会编译,但是上面的代码实际上可以编译。
-
0x.1P1是一个带指数的十六进制文字。0x.1是数字部分,或这里的 1/16。 “P”后面的数字是该数字乘以2的幂。所以0x.1p1实际上是 1/16 * 2 或 1/8。如果你想知道0xFULL那只是0xF,ULL是unsigned long long的后缀 -
C 语法——为专家和琐事爱好者提供无穷无尽的材料,但最终并不是那么重要。
标签: c obfuscation literals bit-shift digraphs