C语言输出结果不对

#include <stdio.h>

int main()
{
int i,j,k;

i = 1;
j = 1;
k = 1;

printf("%d\n",(++i) || (++j) && (++k));
printf("%d %d %d\n",i,j,k);

return 0;
}为什么i,j,k输出的结果是 2 , 1, 1

这是因为程序||的运算方式造成的,因为||运算时候有一个为真的时候,结果就是真,(++i) 是真,那么就不会再往后计算,所以后面的++j, ++k 都不会被执行。 如果你想要验证这个问题,可以这样试一下,把你这句||之前的改为假 , 就是++i改为--i, 这样这里结果为0, 后面的就执行到了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-05-30
对于C,||运算是,如果左边部分是1,那么右边不需要判断,直接返回1;
所以对于++i||++j&&++k,++优先级高于||,首先判断++i,i=2是true,所以直接返回1,后面不需要判断了。
所以输出1;
而j,k值没有改变,i变成2;
所以输出:2,1,1追问

但是k前面的是&&啊,不判断一下直接就跳过了吗

第2个回答  2016-05-30
,(++i) || (++j) && (++k))
这个表达式就是先计算++i,值为2,非零,后面是逻辑或,无论后面的子表达式值为多少,结果都为真,所以要停止计算,++j与++k不执行。
结果i==2,j==1,k==1。追问

但是k前面的是&&啊,不判断一下直接就跳过了吗

追答

C要求编译器必须从左向右算起,当计算结果可以获知整个表达式的终值时,就要停止计算。

(++i) || (++j) && (++k)) 这里只要(++i) 不等于0 c编译器不会去运行后半代码,因为(++i) ==2,后半代码不管是什么这里的条件都是真,没必要运行后半代码

追问

如果直接跳过的话不就把j&&k 看成一个整体了吗?如果按照从左至右计算的话,是不是应该先判断i || jj为真以后,再将 1 和k进行对比?

第3个回答  2016-05-30
c语言丨丨是或 且未真 后面不执行 直接输出 所以输出i=2 jk=1
望采纳
第4个回答  2016-05-30
当然啦,第一,^并不是幂符号,而是异或运算符修改为if(i%2==0)s=s+x/(1+2*i);elses=s-x/(1+2*i);

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网