2017-01-03 13 views
2

私はubuntu端末gccコンパイラでC言語でプログラミングしています。 printfは何も出力していません。理由を説明してください。Printfは期待した結果を印刷しません。なぜですか?

#include <stdio.h> 
int main() 
{ 
    int c; 
    while (c = getchar() == EOF) 
    { 
     printf("%d\n", (int)c); 
    } 
    return 0; 
} 
+3

'ながら(C = GETCHAR()== EOF)' - > '一方((C = GETCHAR())== EOF)' – BLUEPIXY

+1

int' 'に 'C'をキャストする必要はありません、 'int'へのプロモーションは可変的な関数に対して暗黙的に行われるためです。 – alk

+0

@alk不明確: 'int'への暗黙のプロモーションはあなたを指していますか? – chux

答えて

3
c = getchar() == EOF 

手段c = (getchar() == EOF)代入式は右結合であり、コンマ式から離れてすべての式から最低の優先順位を有するもの。

あなたのコードを意味する、ほとんどc = 0です。したがって、ループwhile(0)は実行されません。

while ((c = getchar()) != EOF)を意味します。

また、default argument promotionsが自動的にそれを行うため

printf("%d\n", (int)c); 

intcをキャストする必要はありません。

正しいコードはそうであってもよい。

#include <stdio.h> 
int main() 
{ 
    int c; 
    while ((c = getchar()) != EOF) 
     printf("%d\n", c); 
    return 0; 
} 
+0

[類似の質問](http://stackoverflow.com/questions/41447252/printf-not-giving -output-in-c?noredirect = 1#comment70102660_41447252):あなたが「デフォルトの引数のプロモーションが自動的に行うので」と言っているプロモーションは何ですか? 「int cをint型にキャストする必要はありません」と同意します。 – chux

0

operator precedenceテーブルを参照して、other answerをammendします。

等価演算子==は、代入=よりも優先順位が高いため、最初は等価チェックが行われ、結果が割り当てられます。これは不要なものです。だから、

(c = getchar() == EOF) 

のような文は間違っある

(c = (getchar() == EOF)) 

のようにグループ化されます。 のprintf

なぜ、期待される結果からを印刷していませんか?

C11を引用部分は、あなたのケースでは、比較の結果が0または1関連で出力なし、章§6.5.9

詳しく説明するために、 [...]各演算子は、指定された関係が真である場合には1を返し、偽である場合には0を返します。結果はタイプintです。 [...]

ので、割り当てられた値は、いずれか0または1で、あなたは%c書式指定子を使用して、それを印刷してみてください。この値には印刷可能な表現がないため、は表示されません。を参照してください。

FWIW、here's a list of printable and non-printable values.

ソリューション:サブ式の実行順序を強制するために、括弧のペアを使用して、それが明示的に確認し、

while ((c = getchar()) != EOF) 

よう

、と述べました
  • main()の適合署名は、int main(void)であり、atホストされた環境の東。とにかく与えられた引数が暗黙的に促進される

  • (int)へのキャストは不要である、(intよりも低いランクであれば)、。

関連する問題