4

今日はプログラミングのレッスンがありました。コンソールでの非常に簡単な運動。コンソールから文字ごとにロードするループを作成し、getchar()を割り当てて、これらすべてをループ用語で記述しました。

char c;
while((c = getchar()) != '\n'){
...

これは安全に使用できないと言う人もいれば、C / C ++ではできるがC#ではできないと言う人もいます。

私はこれを試しました

string s;
if((s = Console.ReadLine()) != ""){
...

しかし、これも機能するので、なぜこれが安全でないのかわかりません。それともそうではありませんか?

編集:\私もこれを読みましたなぜあなたは条件で割り当てを使用するのですか?しかし、これは私の質問に対する答えではありません。

4

2 に答える 2

3

そのようなコードの可読性について議論することはできますが(そして私が働いたほとんどの場所でコードレビューに合格しないでしょう)、問題は割り当てがあるという事実ではありません。問題は、を返さgetchar()char、を返すという事実ですint。そして、可能な戻り値のセットはに収まりませんchar。コードを次のように変更した場合:

int c;
while ( (c = getchar()) != EOF && c != '\n' ) {
...

それは「安全」です(しかし、私はまだそれを維持したくありません)。cループコントロールでの更新が必要な場合は、ループを使用しforます。

for ( int c = getchar(); c != EOF && c != '\n'; c = getchar() ) {
...

これは少なくとも読み取り可能です。

于 2012-10-24T12:45:01.850 に答える
2

サンプルの主な操作は!=、割り当てではありません。C#でできないこと(そしてそれは正しい設計上の決定だったと思います)は次のようなものです:

if (s = "")
...

ここでの問題は、通常の等号演算子と非常によく似ていることです==。このコードが意図的なものである場合もありますが、通常はタイプミスであり、見つけるのは非常に困難です。これと比較してください:

if (s == "")
...

コードのバグを探しているときは、これを簡単に見落とすことができます。

于 2012-10-24T12:44:33.880 に答える