-3

実行後のprintfがゼロ以外の値を返すことは知っています{EDIT:returns no. この例では、複数の printf を使用しましたが、

 /* As far as i was cocerned Precedence of && is more than ||,
  *and these logical operators check from left to right  
  *So compiler should come to hello and print "hello" then "nice to see you" then "hie" 
  *as all are true it should print "hola" 
  *but i wonder, why here the output is only "hie" and "hola"?
  */  

 #include<stdio.h>
 main()
 {
    if(printf("hie")|| printf("hello")&& printf("nice to see you"))
    printf("\thola\n");
 }
4

6 に答える 6

5

成功printf()すると、書き込まれた文字の総数が返されます。したがってprintf("hie")、論理「または」条件の遅延評価には十分な 3 が返されます。

printf("hie")|| printf("hello") 
// --> 3 || whatever --> 
// true || whatever --> 
// true

したがって、評価する必要はまったくありませんprintf("hello")

于 2013-10-19T07:42:11.063 に答える
3

printf("hie")は 3 を返し、C ではゼロ以外の値は を意味しtrueます。残りは理解しやすいものでなければなりません。

このような状況の場合は、次のことを知っておいてください。

Condition1 || Condition2 || Condition3  || Condition4

Condition3 は、Condition2 が false で、Condition1 も false である場合にのみ評価されます。それ以外の場合、Condition1 が false の場合は Condition2 のみがチェックされ、Condition2 が false の場合は Condition3 がチェックされます。

後者の条件 (条件 1 の後) は評価されません。条件 1 が既に真である場合、条件 2、条件 3、および条件 4 を評価しようとしても意味がないからです。if他の条件がどのように評価されるかに関係なく、コントロールはとにかくブロックに入るためです。

次のような状況の場合:

Condition1 && Condition2 && Condition3 && Condition4

いずれかの条件が false と評価された時点で、他の条件のさらなる評価は行われません (実際には必要ありません)。

個々の条件は、Condition2 のようなより複雑な条件にすることもできます。次の形式の式にすることもできます。

Condition2 -->   ( SubCondition1 || SubCondition2 )

この状況を理解するための良い例は、オブジェクトをテストしてから、NULL他の条件をテストしたいとします。

int *p =NULL;
if( p != NULL && *p < 100)  // -->  *p < 100 Should only checked if p is NOT NULL else Undefined Behavior

^ここで、これが許可されている場合、 を指すポインターを逆参照することになると想像してくださいNULL。これは、そのような評価の最良の例/使用法の 1 つです。

あなたが述べたコメントの1つで&& has more precidence-演算子の優先順位と評価の順序を混同しています。

評価の順序は、優先順位、結合性、または (必然的に) 明らかな依存関係には依存しません。

于 2013-10-19T07:43:33.940 に答える
2

printf()trueまたはを返しませんfalse

書き込まれた文字の合計数を返します。つまり、if ステートメントが思ったとおりに実行されていないということです。

于 2013-10-19T07:42:18.917 に答える
0

OR 演算子は左結合です。つまり、その左側の式全体が左側のオペランドとして扱われます。この場合、AND 演算子は OR 演算子の右側のオペランドに含まれます。演算子の結合性が不明な場合はいつでも使用してください。括弧。

于 2013-10-19T07:53:47.773 に答える