C语言未定义行为问题

b=a+a+(++a);这样的表达式竟然也是未定义的!?它在linuxgcc编译运行结果是a+a然后a自增再加a,有点不理解按道理应该是先自增然后相加??不是吗!麻烦解释... b=a+a+(++a);
这样的表达式竟然也是未定义的!? 它在linux gcc 编译运行结果 是a+a 然后 a 自增再加a , 有点不理解 按道理 应该是 先自增然后相加??不是吗! 麻烦解释一下
展开
 我来答
金色潜鸟
2012-08-08 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5732万
展开全部
编译器对这种语句有自己的解释方法,与程序员的想法会不同。所以,宁可分开多写几句。
main()
{
int a=1,b;
b = a+a+(++a);
printf("%d",b);
}

VC++ 6.0 编译器.
cl /O1 a.c 优化1,结果 6
cl /O2 a.c 优化2,结果 6
不优化,或
cl /Oa a.c 结果 4
ld_sy_125_451
2012-08-08
知道答主
回答量:40
采纳率:0%
帮助的人:22万
展开全部
加减运算顺序是自左向右的!
所以是先进行a+a, 然后 a 自增再加a
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
a190561443
2012-08-08 · 超过32用户采纳过TA的回答
知道大有可为答主
回答量:239
采纳率:0%
帮助的人:93.2万
展开全部
一般这种情况不同编译器可能有不同的实现,对于a的运算排序是不确定的
对于编程风格来说,这种风格是不对,一般编程中可以认为是“Bad Code”, 严重点说可以认为是错误的
追问
你好!感谢你的回答,请问如何培养正确的编程风格,是否有关介绍的资料?
追答
高质量 C++/C 编程指南
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
侍夜南5j
2012-08-08 · 超过15用户采纳过TA的回答
知道答主
回答量:29
采纳率:0%
帮助的人:43.2万
展开全部
纯语法分析:
++a自增运算是在“++a”中的a被使用之前自增,而“+”运算是从左往右的,先计算a+a,然后在加(++a)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Bk0X
2012-08-08 · TA获得超过9413个赞
知道小有建树答主
回答量:1217
采纳率:60%
帮助的人:673万
展开全部
函数参数值的计算次序, 语言规范并没有规定, 由编译器自己定义.

比如
int i = 5;
fun(i, ++i); // 第一个参数被传递的是5还是6, 由编译器决定.

就如1楼的仁兄所言, 这种代码是不应该被写出来的. 分开来写, 不会多打几个字母.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式