为什么k没有增加,而i和j在同一个表达式中增加。我也想知道程序的输出是什么。我得到输出为 -2 3 1 0
#include <stdio.h>
void main()
{
int i=-3, j=2, m, k=0;
m=++i && ++j || ++k;
printf("%d %d %d %d", i, j, m, k);
}
答案 0 :(得分:8)
逻辑或||
短路,以及
++i && ++j
确定整个表达式的值,因此不评估||
的右操作数。
m=++i && ++j || ++k;
是括号m = (++i && ++j) || ++k;
,因为&&
的优先级高于||
。
逻辑运算符的短路意味着只有当左边的评估尚未确定最终结果时才会评估右操作数,对于||
,这意味着右边的操作数仅在左边进行评估计算结果为0,对于&&
,仅在左边的值评估为非零值时才评估右操作数。
首先评估++i && ++j
,然后评估第一个++i
。 i
之前的值为-3
,因此++i
的计算结果为-2
,而非{0},因此++j
也会进行评估。 j
之前的2
值为++j
,因此3
的计算结果为++i && ++j
,这又是非零的,因此||
的计算结果为1(真)。由于k
的左操作数不为零,其结果已经确定(为1),并且未评估右操作数,因此m
保持不变,{{1}}为设为1.
答案 1 :(得分:6)
如果||
条件左侧的项目评估为真,则由于OR条件已经满足,因此没有评估右侧的点。这就是++k
未被评估的原因
答案 2 :(得分:1)
众所周知,这些运营商是短路运营商。因此,如果表达式++i && ++j
为真,则它不会评估k
(我们知道表达式的值,而不管k
的值)。
答案 3 :(得分:1)
它与订单优先权有关。无论何时执行逻辑OR,如果第一个操作数为真,它将停止,在本例中为j。
答案 4 :(得分:0)
逻辑运算符||
的工作方式如下:如果第一个条件为真,则不评估第二个条件。
首先(++i && ++j)
检查。它返回true,因此在||
未评估之后。因此,k的值不会增加。
答案 5 :(得分:0)
#include<stdio.h>
int add(int);
void main()
{
int i=3,k,l;
clrscr();
k= add(++i);
l=add(i++);
printf("i=%d k= %d l=%d",i,k,l);
getch();
}
int add(int ii)
{
++ii;
return(ii);
}
/*th eoutput is
5
5
5 can anyone expalin how? */
答案 6 :(得分:-1)
#包括&#34; stdio.h中&#34;
#包括&#34; CONIO.H&#34;
main()的
{
int rmv = 10,vivek = 10;
clrscr();
rmv ++; //此帖子增量表示增加下一步骤10 + 1
// rmv + 1和rmv ++都是相同的
printf(&#34; 1.rmv ++ =%d \ n&#34;,rmv); //值为10
printf(&#34; 2.rmv ++ =%d \ n&#34;,rmv ++); //值为增量11
++ vivek; //这个预增量意味着首先增加值,1 + 10 = 11
printf(&#34; 1. \ t ++ vivek =%d \ n&#34;,vivek); //// ++ vivek和1 + vivek都相同
printf(&#34; 2. \ t ++ vivek =%d&#34;,++ vivek&#34;);
的getch();
}