4

scanf の戻り値を使用してファイルの終わりを確認する方法についてネットを検索していました。次のコードを見つけましたが、理解するのが難しいですか?

この方法はどのように機能していますか?

「~」演算子は何を意味しますか?

while(~scanf("%d",&n)) { 
  /* Your solution */
}
4

3 に答える 3

9

これは、値が -1 と異なるかどうかをチェックする恐ろしい方法です。~xのビットごとの否定を返しますx。したがって、負の数に使用される補完的なコードを念頭に置いてください(ちなみに、ほとんどのコンパイラでは、このアプローチはあまり移植性がありません)-1は一連の1-sで表される~(-1)ため、ゼロが生成されます。

このアプローチは使用しないでください。簡単に書くscanf("%d", &n) != EOFと分かりやすいです。

于 2013-04-25T11:55:36.587 に答える
2

~ビット単位の NOT 演算子です。scanfしたがって、これは、 -1 以外の値が返されるまでループする、やや難読化された方法です。言い換えると、

while(~scanf("%d",&n))

と同等です

while(scanf("%d",&n) != -1)
于 2013-04-25T11:51:55.920 に答える
0

C では ~ はビット単位のシフト操作を実行する演算子で、元の数値の補数を作成します。そして、Cにはブール型はありません.0は偽です.あなたの例では、それ以外はすべて真です:

while(~scanf("%d",&n)) { 
  /* Your solution */
}

scanf() は、読み取る文字がもうない場合、EOF を返します。これは -1 に等しい (すべてのプラットフォームではありません!) ため、-1 は (111... 32 ビット アーキテクチャでは 32 回) ~EOF = 0 で表されます。コードがすべてのプラットフォームで機能しないというリスクがあります。

于 2013-04-25T13:22:59.573 に答える