5

kがインクリメントされないのに、iとjが同じ式でインクリメントされるのはなぜですか。また、プログラムの出力を知りたいのですが、出力は-2 310として取得されます。

#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の値を持っていたので、0ではないに評価されます。したがって、も評価されます。以前の値を持っていたので、に評価されます。これもゼロではないため、1(真)に評価されます。の左側のオペランドはゼロではないため、その結果はすでに決定されており(1になる)、右側のオペランドは評価されないため、変更されずに1に設定されます。-3++i-2++jj2++j3++i && ++j||km

于 2012-10-27T10:59:13.330 に答える
6

条件の左側の項目が||trueと評価された場合、OR条件はすでに満たされているため、右側を評価しても意味がありません。そのため、++kは評価されていません

于 2012-10-27T10:59:32.287 に答える
1

これらの演算子は、短絡演算子として知られています。したがって、式++i && ++jがtrueの場合、評価されませんk(の値に関係なく、式の値がわかりますk)。

于 2012-10-27T10:59:25.210 に答える
1

それは順序の優先順位と関係があります。論理ORが実行されるときはいつでも、最初のオペランド(この場合はj)がtrueの場合に停止します。

于 2012-10-27T10:59:39.437 に答える
0

論理演算子||は次のように機能します。最初の条件が true の場合、2 番目の条件は評価されません。

というわけでまずは(++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 に答える