请教 warning: operation on ‘i’ may be undefined

ArayChou 2010-11-16 11:27:55



aray@aray:~/C$ cat test.c

# include<stdio.h>

char * strcpy(char * dest, const char * src)
{
int i=0;
while( src[i] !=0) {
dest[i++]=src[i] ; // LINE 7
}
return dest;
}

int main()
{
char * src = "hello\n";
char dest[10];
printf(strcpy(dest,src));
return 0;
}

aray@aray:~/C$ gcc -Wall test.c
test.c: In function ‘strcpy’:
test.c:7: warning: operation on ‘i’ may be undefined

这里为什么会有一个警告
...全文
4506 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ArayChou 2010-11-16
  • 打赏
  • 举报
回复
谢谢楼上各位,学到了一个知识点,sequence point
bourbaki 2010-11-16
  • 打赏
  • 举报
回复
C语言参考手册ch7.12《序列点》有说,看了就明白了
bourbaki 2010-11-16
  • 打赏
  • 举报
回复
可以参看这个http://en.wikipedia.org/wiki/Sequence_point
手机写程序 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 memoleak 的回复:]
引用 2 楼 justkk 的回复:
是有歧义
dest[i++]=src[i]
运行结果取决于先左右操作数的计算顺序

我觉得这个意图很明显的:
1.计算src[i]和dest[i]
2.赋值
3.i++
事实上,=和++同时出现就会warning,如果比较就没有问题,比如改成
if(dest[i++]>src[i])...就没有问题。
总之我觉得一个报warning一个不……
[/Quote]

if(dest[i++]>src[i])...就没有问题。

可能>和=不在一个优先级,但=和++在一个优先级?
bourbaki 2010-11-16
  • 打赏
  • 举报
回复
这是sequence point警告。比如FUN0()+FUN1()这个表达式,两个函数的执行顺序是未定义的,FUN0(),FUN1()的执行顺序是定义了的。比如i=i++也是这样,递增可能在赋值前或后或同时发生。
jihen 2010-11-16
  • 打赏
  • 举报
回复
受教了
freetstar 2010-11-16
  • 打赏
  • 举报
回复
学习了,印象中对c语言的编译器的标准比较乱
memoleak 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 justkk 的回复:]
是有歧义
dest[i++]=src[i]
运行结果取决于先左右操作数的计算顺序
[/Quote]
我觉得这个意图很明显的:
1.计算src[i]和dest[i]
2.赋值
3.i++
事实上,=和++同时出现就会warning,如果比较就没有问题,比如改成
if(dest[i++]>src[i])...就没有问题。
总之我觉得一个报warning一个不报很无厘头,要么都报,要么都不报
手机写程序 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 justkk 的回复:]
是有歧义
dest[i++]=src[i]
运行结果取决于先左右操作数的计算顺序
[/Quote]
同意.
dest[++i]=src[i] ; // LINE 7
同样有警告.
justkk 2010-11-16
  • 打赏
  • 举报
回复
是有歧义
dest[i++]=src[i]
运行结果取决于先左右操作数的计算顺序
手机写程序 2010-11-16
  • 打赏
  • 举报
回复
有意思,改成
dest[i]=src[i];i++;
警告没有了.
dest[i++]=0;//src[i] ; // LINE 7
警告也没有了.
改成
*(dest + i++) = *(src + i);
还是有警告.
看来写代码要规矩点.对编译器来说,这样写还是有歧义的.

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧