同僚からパズルとして与えられたので、この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;
}
この線:
while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
とにそれぞれ変換されるダイグラフ :>
とが含まれているため、次と同等です。<:
]
[
while( a[ 0xFULL?'\0':-1 ] >>= a[ !!0X.1P1 ] )
リテラル0xFULL
は0xF
(と16進数15
)と同じです。はULL
、それがunsigned long long
リテラルであることを指定しています。いずれの場合でも、ブール値としてはtrueであるため、に0xFULL ? '\0' : -1
評価されます'\0'
。これは、数値が単にである文字リテラルです0
。
一方、0X.1P1
あるリテラル進浮動小数点 2/16 = 0.125に等しいです。いずれの場合も、ゼロ以外であり、ブール値としても真であるため、!!
再度2回否定するとが生成され1
ます。したがって、全体が次のように簡略化されます。
while( a[0] >>= a[1] )
演算子>>=
は、左側のオペランドを右側のオペランドで指定されたビット数だけ右にビットシフトし、結果を返す複合代入です。この場合、右側のオペランドa[1]
の値1
は常になので、次と同等です。
while( a[0] >>= 1 )
または、同等に:
while( a[0] /= 2 )
の初期値a[0]
は10です。一度右にシフトすると、5、次に(切り捨て)2、1、最後に0になり、ループが終了します。したがって、ループ本体は3回実行されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加