4

この警告をスローしているサンプルコードが少しあります:

main.c: In function ‘getline_’:
main.c:30:32: warning: operation on ‘c’ may be undefined [-Wsequence-point]

この特定の演習では、||and&&演算子の使用を避ける必要がありましたが、未定義の動作が発生するようには見えません。コンパイラのメッセージ単なる警告ですが、念のために知りたかったのです。このコードは実際に未定義の動作を引き起こすのでしょうか?

 24 int getline_( char s[], int limit)
 25 {
 26     int i, c;
 27     i=0;
 28     for( i=0; (i<limit-1) + ((c=getchar())!='\n') + (c!=EOF) == 3; i++){
 29            s[i]=c;
 30     }
 31     if( c == '\n' ){
 32         s[i]=c;
 33         i++;
 34     }
 35     s[i]='\0';
 36     return i;
 37 }

私の基本的なテストでは問題なく動作するようです。

編集:コメントに従ってタイトルを更新しました。pstに感謝します。

4

1 に答える 1

13

これは未規定の動作です:

(i<limit-1) + ((c=getchar())!='\n') + (c!=EOF) == 3

シーケンス ポイント間の式の評価の順序は、C では規定されていませcEOF

未指定の動作に加えて、これはシーケンス ポイントの規則、特に次の規則に違反しているため、未定義の動作でもあります。

(C99, 6.5p2) 「さらに、以前の値は、保存する値を決定するためにのみ読み取られるものとします。」

于 2012-06-23T19:05:03.993 に答える