c语言中关于加号的神奇问题

TreeCare 2014-06-23 08:31:26
#include <stdio.h>
#include <stdlib.h>

int main()
{
int a[3] = {1,2,3},i = 0;
printf("%d %d %d\n",a[0],a[1],a[2]);
printf("%d %d %d",a[i],a[i++],a[i]);
return 0;
}[/size]
...全文
677 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
TreeCare 2014-06-23
  • 打赏
  • 举报
回复
谢谢前辈们,我有点明白了》
colddown 2014-06-23
  • 打赏
  • 举报
回复
这两个问题都涉及关于C语言sequence point(顺序点)。可以看看这个帖子http://www.chinaunix.net/old_jh/23/310576.html了解。 详细的定义可以在C语言标准的6.5章Expressions找到。 简单的说,像(a++)+(a++)+(a++)+(a++)这样的表达式对于C语言来说是未定义的,也就是一个不合乎标准的表达式。因为在多个a++表达式之间没有序列点来保证side effect的顺序。 如果你用gcc编译器对类似的表达式进行编译,就能够看到有警告关于sequence point. [wangw33@localhost tmp]$ cat main.c int main() { int a = 0; int x = (a++) + (a++); return x; } [wangw33@localhost tmp]$ gcc -Wall -o main main.c main.c: In function 'main': main.c:4:23: warning: operation on 'a' may be undefined [-Wsequence-point] <---警告 int x = (a++) + (a++);
taodm 2014-06-23
  • 打赏
  • 举报
回复
楼主自己认真去看置顶帖。
TreeCare 2014-06-23
  • 打赏
  • 举报
回复
求底层原因?
TreeCare 2014-06-23
  • 打赏
  • 举报
回复
主要是++号多了就乱了,但底层原因是什么呢?
colddown 2014-06-23
  • 打赏
  • 举报
回复
补充:前面的引用来自于C语言标准Programming languages — C ISO/IEC 9899:201x
colddown 2014-06-23
  • 打赏
  • 举报
回复
C语言 EXAMPLE In the function call (*pf[f1()]) (f2(), f3() + f4()) the functions f1, f2, f3, and f4 may be called in any order. All side effects have to be completed before the function pointed to by pf[f1()] is called. 可以说对于函数参数的计算是没有固定顺序的,编译器完全可以按从右到左的顺序去计算参数的值,这样就会产生你看到的现象。
TreeCare 2014-06-23
  • 打赏
  • 举报
回复
这个加号好奇怪
TreeCare 2014-06-23
  • 打赏
  • 举报
回复
我又想起另一个: a =1; 输出 (a++)+(a++)+(a++)+(a++) 结果得到了15,为什么呢?
zhanlibao1131228 2014-06-23
  • 打赏
  • 举报
回复
不应该是 1 1 2 吗
max_min_ 2014-06-23
  • 打赏
  • 举报
回复
输出有顺序的,windows下linux刚好相反的!而且i++是之后的效果的!
TreeCare 2014-06-23
  • 打赏
  • 举报
回复
好奇怪,怎么解释呢?
TreeCare 2014-06-23
  • 打赏
  • 举报
回复
我这结果是:
1 2 3
2 1 1

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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