scanf の戻り値を使用してファイルの終わりを確認する方法についてネットを検索していました。次のコードを見つけましたが、理解するのが難しいですか?
この方法はどのように機能していますか?
「~」演算子は何を意味しますか?
while(~scanf("%d",&n)) {
/* Your solution */
}
これは、値が -1 と異なるかどうかをチェックする恐ろしい方法です。~x
のビットごとの否定を返しますx
。したがって、負の数に使用される補完的なコードを念頭に置いてください(ちなみに、ほとんどのコンパイラでは、このアプローチはあまり移植性がありません)-1は一連の1-sで表される~(-1)
ため、ゼロが生成されます。
このアプローチは使用しないでください。簡単に書くscanf("%d", &n) != EOF
と分かりやすいです。
~
ビット単位の NOT 演算子です。scanf
したがって、これは、 -1 以外の値が返されるまでループする、やや難読化された方法です。言い換えると、
while(~scanf("%d",&n))
と同等です
while(scanf("%d",&n) != -1)
C では ~ はビット単位のシフト操作を実行する演算子で、元の数値の補数を作成します。そして、Cにはブール型はありません.0は偽です.あなたの例では、それ以外はすべて真です:
while(~scanf("%d",&n)) {
/* Your solution */
}
scanf() は、読み取る文字がもうない場合、EOF を返します。これは -1 に等しい (すべてのプラットフォームではありません!) ため、-1 は (111... 32 ビット アーキテクチャでは 32 回) ~EOF = 0 で表されます。コードがすべてのプラットフォームで機能しないというリスクがあります。