私はubuntu端末gccコンパイラでC言語でプログラミングしています。 printfは何も出力していません。理由を説明してください。Printfは期待した結果を印刷しません。なぜですか?
#include <stdio.h>
int main()
{
int c;
while (c = getchar() == EOF)
{
printf("%d\n", (int)c);
}
return 0;
}
私はubuntu端末gccコンパイラでC言語でプログラミングしています。 printfは何も出力していません。理由を説明してください。Printfは期待した結果を印刷しません。なぜですか?
#include <stdio.h>
int main()
{
int c;
while (c = getchar() == EOF)
{
printf("%d\n", (int)c);
}
return 0;
}
c = getchar() == EOF
手段c = (getchar() == EOF)
代入式は右結合であり、コンマ式から離れてすべての式から最低の優先順位を有するもの。
あなたのコードを意味する、ほとんどc = 0
です。したがって、ループwhile(0)
は実行されません。
while ((c = getchar()) != EOF)
を意味します。
また、default argument promotions
が自動的にそれを行うため
printf("%d\n", (int)c);
にint
にc
をキャストする必要はありません。
正しいコードはそうであってもよい。
#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != EOF)
printf("%d\n", c);
return 0;
}
[類似の質問](http://stackoverflow.com/questions/41447252/printf-not-giving -output-in-c?noredirect = 1#comment70102660_41447252):あなたが「デフォルトの引数のプロモーションが自動的に行うので」と言っているプロモーションは何ですか? 「int cをint型にキャストする必要はありません」と同意します。 – chux
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
よりも低いランクであれば)、。
'ながら(C = GETCHAR()== EOF)' - > '一方((C = GETCHAR())== EOF)' – BLUEPIXY
int' 'に 'C'をキャストする必要はありません、 'int'へのプロモーションは可変的な関数に対して暗黙的に行われるためです。 – alk
@alk不明確: 'int'への暗黙のプロモーションはあなたを指していますか? – chux