【发布时间】:2012-06-23 19:02:42
【问题描述】:
我有一些示例代码会引发此警告:
main.c: In function ‘getline_’:
main.c:30:32: warning: operation on ‘c’ may be undefined [-Wsequence-point]
在这个特定的练习中,我要避免使用 || 和 && 运算符,但这似乎不会产生未定义的行为。编译器消息 is 只是一个警告,但我想知道以了解情况。这段代码真的会产生未定义的行为吗?
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。
【问题讨论】:
-
仅仅因为“它在这里工作”并不意味着它是定义的行为。 UB 可能是您一直观察到的行为......(不过,它可能涉及将仓鼠飞到其他地方)
-
这正是我想确定并来到这里的原因。 :)
-
考虑提炼测试用例(可以生成更少的警告)并将其合并到标题中。它基本上归结为:
(c=x) + (c==y)
标签: c undefined-behavior