[解決済み】C言語における>>>=演算子とは?
2022-04-01 13:55: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;
}
解決方法は?
ラインです。
while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
には
グラフ
:>
と
<:
に変換されます。
]
と
[
とそれぞれ同じなので、同等です。
while( a[ 0xFULL?'\0':-1 ] >>= a[ !!0X.1P1 ] )
リテラル
0xFULL
と同じです。
0xF
(これは
15
); である。
ULL
が指定されているだけです。
である。
unsigned long long
リテラル
. いずれにせよ、ブール値としては真なので
0xFULL ? '\0' : -1
は、次のように評価されます。
'\0'
であり、これは
文字リテラル
その数値は単に
0
.
一方。
0X.1P1
は
16進数浮動小数点数リテラル
は2/16=0.125に等しい。 いずれにせよ、0でない以上、ブール値としても真であるため、これを2回否定して
!!
を再び生成します。
1
. こうして、全体が単純化される。
while( a[0] >>= a[1] )
演算子
>>=
は
複合代入
は、左オペランドを右オペランドで指定されたビット数だけ右にビットシフトし、その結果を返します。 この場合、右オペランド
a[1]
は常に値
1
と等価なので
while( a[0] >>= 1 )
または、同等に
while( a[0] /= 2 )
の初期値は
a[0]
は10です。 右に1回シフトした後、5、(切り捨て)2、1、最後に0となり、ここでループが終了します。 このように、ループ本体は3回実行される。
関連
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】ビットシフト(bit-shift)演算子とは、どのようなもので、どのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】strcmpが機能しない
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み] '{'トークンの前に期待される式
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?
-
[解決済み] C++における二重否定