
c语言中为什么int i=5;p=(++i)+(++i)+(++i);printf("%d",p)的
c语言中为什么inti=5;p=(++i)+(++i)+(++i);printf("%d",p)的输出结果是22而不是21呢?6+7+8不是21吗?(程序main函数等省...
c语言中为什么int i=5;p=(++i)+(++i)+(++i);printf("%d",p)的输出结果是22而不是21呢?6+7+8不是21吗?(程序main函数等省略)我用的软件是创天中文vc++,用的是c语言头文件。期待您的回答!
展开
6个回答
展开全部
怎么会呢?它们是前缀增1符,先增1再运算,先做两次++i,i就成7了;从左至右计算,把前两个式子加起来放在一个临时变量中,比如A中,它就等于14;然后再与第三个式子相加,i又要增1成为8,可是这一次不能给A增了,所以是14+8=22。不过这与你使用的编译器有关,有些编译器可能会计算出24来——那是因为有些编译器先把所有的增1去做完再相加,不就是3x8=24了。所以不要用这种边缘化语法写代码。不过你的6+7+8的理解是什么样的编译器都不会做出来的,因为前缀增1是要在运算前执行,前两项中是同一个变量i,怎么做完会是一个6一个7呢?
展开全部
这个跟编译器有关!
在vs2008上面的运行结果竟然是24!不可思议~~
在vs2008上面的运行结果竟然是24!不可思议~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不要纠结与这种无聊的问题 这种题目没有实质意义 不同编译器会有不同结果
这题出现21 22 23 24都是有可能的 你要看编译器编译后的代码才知道
写代码千万不能这么写 太牛角尖了
这题出现21 22 23 24都是有可能的 你要看编译器编译后的代码才知道
写代码千万不能这么写 太牛角尖了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int 5;
p=(++i)+(++i)+(++i);
顺序的演示:
p=(++6)+(++7)+(++8); ==》 p=(++7)+15; ==》p=7+15; ==》p=22;
p=(++i)+(++i)+(++i);
顺序的演示:
p=(++6)+(++7)+(++8); ==》 p=(++7)+15; ==》p=7+15; ==》p=22;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这样写比较好吧
int r, s, t;
r = ++i;
s = ++i;
t = ++i;
k = r + s + t;
因为p=(++i)+(++i)+(++i); 表达式中的三个++i的求值顺序是任意的,编译器想先做哪个就先做哪个。而每做一个,都会依赖另一个,直到分号结束,所以这个时候编译器想怎样取舍都是可以的,不管++i还是i++它都既可以取没加1之前的值也可以取加1后的值来作为++i或者i++的值,这样每次都有不同的取舍,直到分号结束,所以p的值可能有不同的情况。这个表达式违反了C语言有关顺序点的规定,编译器给出的值也具有一定的任意性,没有人能确切地告诉你它们的值, 不同的编译器可能会给出不同的值. 所以分开写比较好....
你还可以再查查1++和++1的区别:
i++与i--在参与运算的时候值被当做i
++i与--i被当做修改后的值
int r, s, t;
r = ++i;
s = ++i;
t = ++i;
k = r + s + t;
因为p=(++i)+(++i)+(++i); 表达式中的三个++i的求值顺序是任意的,编译器想先做哪个就先做哪个。而每做一个,都会依赖另一个,直到分号结束,所以这个时候编译器想怎样取舍都是可以的,不管++i还是i++它都既可以取没加1之前的值也可以取加1后的值来作为++i或者i++的值,这样每次都有不同的取舍,直到分号结束,所以p的值可能有不同的情况。这个表达式违反了C语言有关顺序点的规定,编译器给出的值也具有一定的任意性,没有人能确切地告诉你它们的值, 不同的编译器可能会给出不同的值. 所以分开写比较好....
你还可以再查查1++和++1的区别:
i++与i--在参与运算的时候值被当做i
++i与--i被当做修改后的值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询