C语言的自加自减运算符
比如y的初值为5,为什么a=(y++)+(y++)+(y++)的值是15难道每一次y++的值都不变?但是建立一个新程序,y的初值还是5b=(++y)+(++y)+(++y...
比如y的初值为5,
为什么a=(y++)+(y++)+(y++)的值是15 难道每一次y++的值都不变?
但是建立一个新程序 ,y的初值还是5
b=(++y)+(++y)+(++y)的值是22,这又是为什么? 展开
为什么a=(y++)+(y++)+(y++)的值是15 难道每一次y++的值都不变?
但是建立一个新程序 ,y的初值还是5
b=(++y)+(++y)+(++y)的值是22,这又是为什么? 展开
展开全部
这两个都是未定义行为,因为(y++)+(y++)+(y++)里面没有顺序点,所以你无法保证执行完第一个y++之后,y的值是否增加了,如果增加了,那么第二个y++就会是6。
只有顺序点才能确定一个副作用被实现,在这里,副作用就是确保y++之后,y加1。
下面的那个++y亦是同理。
至于什么是顺序点,可以参考这个:
C/C++语言定义(语言的参考手册)明确定义了顺序点的概念。顺序点位于:
1. 每个完整表达式结束时。完整表达式包括变量初始化表达式,表达式语句,return语句的表达式,以及条件、循环和switch语句的控制表达式(for头部有三个控制表达式);
2. 运算符 &&、||、?: 和逗号运算符的第一个运算对象计算之后;
3. 函数调用中对所有实际参数和函数名表达式(需要调用的函数也可能通过表达式描述)的求值完成之后(进入函数体之前)。
只有顺序点才能确定一个副作用被实现,在这里,副作用就是确保y++之后,y加1。
下面的那个++y亦是同理。
至于什么是顺序点,可以参考这个:
C/C++语言定义(语言的参考手册)明确定义了顺序点的概念。顺序点位于:
1. 每个完整表达式结束时。完整表达式包括变量初始化表达式,表达式语句,return语句的表达式,以及条件、循环和switch语句的控制表达式(for头部有三个控制表达式);
2. 运算符 &&、||、?: 和逗号运算符的第一个运算对象计算之后;
3. 函数调用中对所有实际参数和函数名表达式(需要调用的函数也可能通过表达式描述)的求值完成之后(进入函数体之前)。
参考资料: bbs.csdn.net/topics/370153775
展开全部
这实在是个令人纠结的问题。
C语言中区分前自增与后自增,它们都有副作用,尤其是后自增。
前自增可能更好一点,它不产生临时变量,效率更高一些。
++y相当于:y=y+1;在变量的使用之前先自增。
y++相当于:y; 其它语句... y=y+1;也就是使用它时,它的值不变,在其使用之后的某一时刻但在再次使用它前其值加一。而且不同的编译器不一定有一致的实现行为。
a=(y++)+(y++)+(y++) 这是一条语句,通常的编译器实现会将此语句一次性扫描完成。这种情况下,y++会保持其值不变,此语句完成后,将y的值递增3次。
b=(++y)+(++y)+(++y)这也是一条语句,编译器扫描完此语句后,先将y递增3次,再作+运算,将运算结果赋予b,此时b应该为24。 但是不同的系统及编译器不一定这样实现,还有可能y依次递增,其结果是21。
C语言中区分前自增与后自增,它们都有副作用,尤其是后自增。
前自增可能更好一点,它不产生临时变量,效率更高一些。
++y相当于:y=y+1;在变量的使用之前先自增。
y++相当于:y; 其它语句... y=y+1;也就是使用它时,它的值不变,在其使用之后的某一时刻但在再次使用它前其值加一。而且不同的编译器不一定有一致的实现行为。
a=(y++)+(y++)+(y++) 这是一条语句,通常的编译器实现会将此语句一次性扫描完成。这种情况下,y++会保持其值不变,此语句完成后,将y的值递增3次。
b=(++y)+(++y)+(++y)这也是一条语句,编译器扫描完此语句后,先将y递增3次,再作+运算,将运算结果赋予b,此时b应该为24。 但是不同的系统及编译器不一定这样实现,还有可能y依次递增,其结果是21。
追问
但是在VC里面编译执行的时候结果是22...而且单独执行b=(++y)+(++y);的时候结果是14...
追答
所以最好不要这样使用自增,副作用无法估计,最好单语句使用
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
printf("%d\n",++i);//9
i=9
printf("%d\n",--i);//8
i=8
printf("%d\n",i++);//8
i=9
printf("%d\n",i--);//9
i=8
printf("%d\n",-i++);//-8
i=9
printf("%d\n",-i--);//-9
i=8
前面是输出值,后面是执行该语句后的i值。-i++应该这样分,输出的是-i,执行后i自动加1。i的值始终是正的,最后2个输出的是-i。
i=9
printf("%d\n",--i);//8
i=8
printf("%d\n",i++);//8
i=9
printf("%d\n",i--);//9
i=8
printf("%d\n",-i++);//-8
i=9
printf("%d\n",-i--);//-9
i=8
前面是输出值,后面是执行该语句后的i值。-i++应该这样分,输出的是-i,执行后i自动加1。i的值始终是正的,最后2个输出的是-i。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第五个:-i
++是先把
-i输出,在i=i+1;则i
=9;输出为:
-8
第六个:
-i
--是先把-i输出,再i=i-1;则i=8;
输出为
-9;
输出负数是因前面的
-
符号.,而i是正数
++是先把
-i输出,在i=i+1;则i
=9;输出为:
-8
第六个:
-i
--是先把-i输出,再i=i-1;则i=8;
输出为
-9;
输出负数是因前面的
-
符号.,而i是正数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a++和++a,
前一个先把a用了
然后再给a加一,后一个
先把a自己增加一
然后
再
做运算;
例如:
x=5;
y=++x;
x先加到6,然后再将x的值应用到表达式y=x中,y值为6
x,y都为6
x=5;
y=x++;
x为6,y为5.
同样,对于你的数组也适用!
前一个先把a用了
然后再给a加一,后一个
先把a自己增加一
然后
再
做运算;
例如:
x=5;
y=++x;
x先加到6,然后再将x的值应用到表达式y=x中,y值为6
x,y都为6
x=5;
y=x++;
x为6,y为5.
同样,对于你的数组也适用!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询