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 中未指定。如果赋值c发生在与 的相等性检查之前,则未指定EOF

除了未指定的行为之外,它也是未定义的行为,因为它违反了序列点规则,尤其是这个:

(C99, 6.5p2)“此外,应仅读取先验值以确定要存储的值。”

于 2012-06-23T19:05:03.993 回答