
C语言自加运算符运行优先级问题
#include<stdio.h>main(){floatx=1,y;<br>y=x++*x++;/*变化句*/<br>printf("%.1f,%.1f\n",x,y)...
#include <stdio.h>
main()
{float x=1,y;<br> y=x++*x++;/*变化句*/<br>printf("%.1f,%.1f\n",x,y);<br>}
我想知道“变化句”是怎么运行的,“x”和“y”的只是怎样变化的;还有为什么变化句换成"y=x++*x++"、"y=x++*(x++)"、"y=(x++)*(x++)"、"y=(x++)*x++"运行后的“x”、“y”值是一样的;而换成"y=(x++)*++x"、"y=x++*++x"、"y=(x++)*(++x)"、"y=x++*(++x)"、"y=++x*x++"、"y=(++x)*x++"、"y=(++x)*(x++)"、"y=++x*(x++)"运行后的“x”、“y”值是一样的,‘y’的值为什么与之前的值不同.在换成"y=(++x)*++x"、"y=(++x)*(++x)"运行后的‘x’值为什么没变,而‘y’又变了呢再有换成"y=++x*++x"、"y=++x*(++x)"运行后的‘x’值为什么还是没变,而‘y’又变了 这其中的优先级到底是怎么变换的? 展开
main()
{float x=1,y;<br> y=x++*x++;/*变化句*/<br>printf("%.1f,%.1f\n",x,y);<br>}
我想知道“变化句”是怎么运行的,“x”和“y”的只是怎样变化的;还有为什么变化句换成"y=x++*x++"、"y=x++*(x++)"、"y=(x++)*(x++)"、"y=(x++)*x++"运行后的“x”、“y”值是一样的;而换成"y=(x++)*++x"、"y=x++*++x"、"y=(x++)*(++x)"、"y=x++*(++x)"、"y=++x*x++"、"y=(++x)*x++"、"y=(++x)*(x++)"、"y=++x*(x++)"运行后的“x”、“y”值是一样的,‘y’的值为什么与之前的值不同.在换成"y=(++x)*++x"、"y=(++x)*(++x)"运行后的‘x’值为什么没变,而‘y’又变了呢再有换成"y=++x*++x"、"y=++x*(++x)"运行后的‘x’值为什么还是没变,而‘y’又变了 这其中的优先级到底是怎么变换的? 展开
2个回答
2013-07-27
展开全部
"y=x++*x++"、"y=x++*(x++)"、"y=(x++)*(x++)"、"y=(x++)*x++"与"y=(x++)*++x"、"y=x++*++x"、"y=(x++)*(++x)"、"y=x++*(++x)"、"y=++x*x++"、"y=(++x)*x++"、"y=(++x)*(x++)"、"y=++x*(x++)"的不同在于前者表达式中++均是前置的,后者中有前置也有后置++ --两个操作符要求操作数必须是一个左值 前缀形式的++操作符出现在操作数的前面。操作数的值被增加而表达式的值就是操作数增加后的值。后缀形式的++操作符出现在操作数的后面。抽象的说,前缀和后缀形式的增值操作符都复制一份变量值的拷贝。前缀操作符在进行复制之前改变变量的值,后缀操作符在进行复制之后改变变量的值。这些操作符的结果不是被他们所修改的变量,而是变量值的拷贝。 你所问的确实是优先级的问题就拿你的表达式中y=++x*++x 一般编译器都是自右向左堆栈,也就是从右向左计算后面的++x自增1在进行x加1后的拷贝进行表达式运算,可是你能否知道运算下一个++x中x的取值是在进行了第一次++x后的x的值还是起初x的值呢 下面有两个例子1.a=5; c=1+a++; c=++a;语句先进行a值的拷贝,这份拷贝值(5)参加表达式的运算,然后a值自 增 1;那么当a值的拷贝出现之后,a就是6了;所以第一次赋值c为6,第二次c为7; 2.c++ + ++c - --c + c++你知道表达式的结果吗?因为这里有一个问题,这是c的缺陷为了说明这个问题,请你不厌其烦的看看下面的东西 这是我之前帮别人解答的 相信你看完之后就会明白 这是表达式本身的缺陷引起的,问题在于:优先级只对相邻操作符的执行顺序起作用。 下面有4个例子: 1.a+b*c *操作符的优先级比+高,所以乘法先于加法先执行,编译器在这里别无选择。 2. a*b+c*d+e*f 表达式的缺陷暴露了,我们知道*先于+执行,但表达式会有下面的求值顺序: a*b c*d (a*b)+(c*d) e*f (a*b)+(c*d)+(e*f) 也会有这样的求值顺序: a*b c*d e*f (a*b)+(c*d)+(e*f) 注意第一个加号与第三个乘号,我们并没有任何规则要求所有的乘法运算首先执行,也没有规定这几个乘法之间谁先执行,优先级在这里 起不到作用3. c+ --c --优先运算,但我们并不知道c(左操作数)是在--c(右操作数)之前还是之后进行求值,表达式的两种情况将会不同,这就是操作符的副作用4. 看下这个戏剧化的表达式: i=i-- - --i * (i = -3) * i++ + ++i 它的结果是 42(Microsoft C 5.1) 36 (Dec VAX/VMS) 30(Dec Alpha OSF) 22(FreeBSD2.1R) 21(TC++), 4, -63,-85,-86,-95,-128...但你不能说任何一种结果是错误的! 所以说,编译器产生的结果可能令你匪夷所思,你之前所预测的结果可能与现实不太一样,只是它们不是按照你的求值顺序,对结果来说,你的想法就是BUG,但对漏洞来说,你的结果也没有错,只是一种可能,它们正是按照选定的求值顺序进行运算,这可能跟硬件要求和操作系统有关这种副作用无法避免,你在使用他们的时候要对他们了如指掌
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-27
展开全部
x++的时候是先运算再加加;++x的时候是先加加再运算。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询