5

为什么 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);
}
4

7 回答 7

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(真)。由于 的左操作数||不为零,其结果已经确定(为 1),并且右操作数未计算,因此k保持不变并m设置为 1。

于 2012-10-27T10:59:13.330 回答
6

如果条件左侧的项目||评估为真,则评估右侧没有意义,因为 OR 条件已经满足。这就是为什么++k没有被评估

于 2012-10-27T10:59:32.287 回答
1

这些运算符被称为短路运算符。因此,如果表达式++i && ++j为真,它不会计算k(我们知道表达式的值,而不管 的值如何k)。

于 2012-10-27T10:59:25.210 回答
1

它与订单优先级有关。每当执行逻辑 OR 时,如果第一个操作数为真(在本例中为 j),它将停止。

于 2012-10-27T10:59:39.437 回答
0

逻辑运算符的||工作方式如下:如果第一个条件为真,则不评估第二个条件。

所以首先(++i && ++j)检查。它返回 true,因此在它||不被评估之后。因此,k的值没有增加。

于 2014-06-25T17:58:12.273 回答
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? */
于 2015-08-20T08:52:11.713 回答
-1

#include“stdio.h”

#include“conio.h”

主要的()

{

int rmv=10,vivek=10;

clrscr();

rmv++;//本帖增量表示下一步增量10+1

//rmv+1 和 rmv++ 都一样

printf("1.rmv++=%d\n",rmv);//值为10

printf("2.rmv++=%d\n",rmv++);//值为增量11

++vivek;//这个预加的意思是先加值所以,1+10=11

printf("1.\t++vivek=%d\n",vivek);////++vivek 和 1+vivek 都是一样的

printf("2.\t ++vivek=%d",++vivek");

getch();

}

于 2014-10-09T07:49:13.250 回答