C语言自加运算符运行优先级问题

#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’又变了 这其中的优先级到底是怎么变换的?

第1个回答  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,但对漏洞来说,你的结果也没有错,只是一种可能,它们正是按照选定的求值顺序进行运算,这可能跟硬件要求和操作系统有关这种副作用无法避免,你在使用他们的时候要对他们了如指掌
第2个回答  2013-07-27
x++的时候是先运算再加加;++x的时候是先加加再运算。

C语言中,运算优先级是怎样的?
1. C语言中的自增运算符 ++ 和自减运算符 --,在作为后缀运算符时(例如 x++),相较于作为前缀运算符时(例如 ++x),具有更高的优先级。2. +、-、* 和 & 运算符既可以作为一元运算符(只需要一个操作数),也可以作为二元运算符(需要两个操作数)。例如,* 在只有一个操作数时表示间...

C语言运算符优先级顺序是怎样的?
C语言运算符优先级顺序如下所示:自增运算符 ++ 和自减运算符 --,在作后缀运算符(如表达式 x++)时,较其用作前缀运算符(如表达式 ++x)时,具有较高的优先级。+、-、* 和 & 运算符记号不但可以当作一元运算符(unary operator,只需要一个操作数),也可以当作二元运算符(binary operator,...

c语言自增问题,优先级
1. "花括号操作符" 优先级大于 "加号操作符"2. 两个连续的 "加号操作符" 执行时先执行第一个 3. 先自增会在当前的操作执行完毕后执行 (这一点是 y 值最重要的一点)故需要将 y 分成两大部分执行 一、 (++a) + (++a) => 第一个加号先执行,但这里有花括号 (逻辑3) 所以 a 先自...

c语言中自增自减运算符的运算次序?
i++,i--表示是使用之后自增或者自减1;main(){int i=1;i++,++i; \/\/这一条执行完i=1+1+1=3 printf("%d%d",i++,--i); \/\/ 这里是自右往左的顺序i的值先是-1=2,然后i再+1=3,相当于printf("%d%d",2,3);}

c++运算符的优先级顺序
c语言运算符优先级从高到低的顺序依次如下:优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合,同一行中的运算符的优先级相同。不同类型的运算符之间也有相应的优先级...

C语言运算符的优先级
5、C语言运算符优先级顺序如下所示:自增运算符++和自减运算符--,在作后缀运算符(如表达式x++)时,较其用作前缀运算符(如表达式++x)时,具有较高的优先级。6、各种运算符间的优先级数值运算符、字符串运算符、关系运算符、逻辑运算符。可以用括号改变优先级顺序,使得括号内的运算优先于括号外...

c语言中关系运算符和自加自减运算优先级哪个高
c语言中关系运算符比自加自减运算优先级低。各种运算符间的优先级从高到低为数值运算符、字符串运算符、关系运算符、逻辑运算符。可以用括号改变优先级顺序,使得括号内的运算优先于括号外的运算。对于多重括号,总是由内到外强制表达式的某些部分优先运行。自加自减运算符属于数值运算符,优先级比关系...

C语言自加运算符运行优先级问题
、"y=(++x)*(x++)"、"y=++x*(x++)"的不同在于前者表达式中++均是前置的,后者中有前置也有后置++ --两个操作符要求操作数必须是一个左值 前缀形式的++操作符出现在操作数的前面。操作数的值被增加而表达式的值就是操作数增加后的值。后缀形式的++操作符出现在操作数的后面。抽象的说,...

C语言中算术运算符优先级的问题
C语言中算术运算符优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合,同一行中的运算符的优先级相同。基本的优先级:1、指针最优,单目运算优于双目运算。2、先运算...

C语言中运算符优先级排序
C语言中运算符优先级排序如下:分为优先级15级:1、圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】;2、逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++】【 --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算...

相似回答