自增运算符问题

发布时间:2024-05-19 11:24 发布:上海旅游网

问题描述:

void main()
{
int i,j,k;
i=j=k=-1;
++i || ++j && ++k || i++;
printf("i=%d\tj=%d\tk=%d\n",i,j,k);

}
运行结果是 i=1 j=0 k=-1
为什么会有这样的结果 请详细讲解一下啊 谢谢了!!!

问题解答:

i++是先取值后加,++i先加后取值
i=j=k=-1 即对i j k分别赋值-1 -1 -1
++i 先加 则i变为了0 ||为或运算符 则需继续判断后面的++j的值才能判断逻辑表达式的值 所以++j变为了0 有遇到与运算符 由于与运算符前面的表达式的值已经为0 所以就不需要判断它后面的式子的值就知道整个式子值为0 了 固不在进行++k运算了 那么k值不变 仍为-1 在判断第二个或运算符 由于其前面的式子的值为0 所以需要继续判断其后面式子的值 那么就需要计算i++ 由于经过前面的运算i已经为0了 在i++就变为1了
所以运行结果是 i=1 j=0 k=-1
注意||和&&是同运算级 所以从左到右计算逻辑表达式的值

用到的主要原理就是:
a&&b&&c 只有a为真(非0)时 ,才需要判别b的值 只有a b的值都为真时 才需要判别c的值
a||b||c 只要a为真(非0)时 就不必判断b和c

大致就是这样了!!!

++i || ++j && ++k || i++;
先执行++i,加完是0,继续执行
++j && ++k 由于++j为0 ,++k就不算了,算了也白算,这就是"短路求值"(同理如果||前面那个表达式是1,后面的也不算了)又是0 ,继续执行 i++,i又加了一次

所以
i加过2次,j加过一次,k没有加过

++i || ++j && ++k || i++;
1、假设“++j&&++k”是M
则原式可改写为:++i ||M|| i++;
2、“||”运算级低于“&&“所以先要求出M的值,两个“||”同级可以从左向右求值
3、所以先出M求值;又因为++j是先增值再使用,并且他是一个断路表达式,所以后面的++k并没有执行。所以M执行完后,j==0,k不变。
4、然后对++i||M||i++进行求值,此时M值为0,那么就要求此时式中的++i和i++都要进行计算,所以经常两次增值后,i=1。
5,这样表达式的求解过程就结束了,结果为i=1,j=0,k=-1;

&&的优先级高于|| 所以先算的这个
因为++j && ++k 是先算++j得j=0,因为0||任何数=0 ,所以编译器不会再算++k, 开始从左到有算||,++i使i=0,而0||i++,要由第二个来决定是否为真,所以算i++, 此时i=0,j=0,k=-1.
执行下一条输出语句的时候i又自动加1,所以答案为i=1 j=0 k=-1

举个例子,i++是先取值后加,++i先加后取值。

注意:&&优先级高于||,其他相同

热点新闻