我不明白这个C程序实际上是如何编译和运行的,这是一个同事给出的难题。这个>>>=
操作符和奇怪的1P1
文字是什么?我已经在克隆和GCC上测试过了。没有任何警告,输出为“?”
#include <stdio.h>
int main()
{
int a[2]={ 10, 1 };
while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
printf("?");
return 0;
}
发布于 2014-08-26 06:17:58
这行代码:
while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
包含digraphs :>
和<:
,分别转换为]
和[
,因此等效于:
while( a[ 0xFULL?'\0':-1 ] >>= a[ !!0X.1P1 ] )
文字0xFULL
与0xF
相同(对于15
是十六进制);ULL
只是指定了it's an unsigned long long
literal。在任何情况下,作为布尔值,它都是真的,所以0xFULL ? '\0' : -1
的计算结果是'\0'
,这是一个数值仅为0
的character literal。
同时,0X.1P1
是等于2/16 = 0.125的hexadecimal floating point literal。在任何情况下,它都是非零的,作为布尔值也是真的,所以再次用!!
对它求反两次会产生1
。因此,整个过程简化为:
while( a[0] >>= a[1] )
运算符>>=
是一个compound assignment,它将其左操作数向右移位由右操作数给出的位数,并返回结果。在这种情况下,右操作数a[1]
的值始终为1
,因此它等效于:
while( a[0] >>= 1 )
或者,等效地:
while( a[0] /= 2 )
a[0]
的初始值是10。右移一次后,它变成5,然后(向下舍入) 2,然后是1,最后是0,在这一点上循环结束。因此,循环体被执行了三次。
https://stackoverflow.com/questions/25495042
复制相似问题