2017-03-21 3 views
-1

を使用しないようにコード代入演算子を使用している同じように動作している場合:句は、それがここに等しい演算子

#include <stdio.h> 
#include <math.h> 
void main() 
{ 
     double pi = 3.1415926535; 
     int a = 1; 
     int i;  
     for (i=0; i < 3; i++) 
      if (a = cos(pi * i/2)) 
        printf("% d", 1); 
      else printf("%d", 0); 
} 

if (a = cos(pi * i/2))は、次に割り当て動作を行い、ラインが条件をチェックします。そのようにして、割り当て操作が常に実行されるので、出力は常に1になるはずです。しかしここに出力は10 1となります。だから私はそれが間違っていると思う。出力が10 1で、111でないのはなぜですか?助けてください。

答えて

2

最初に=が代入演算子です。コンパイラはあなたに警告するはずですが、警告を無視しましたか?まあ、しないでください!

第二に、あなたは確実に浮動小数点数を比較することはできません、とcos()は、そのような数を返しますので、おそらく

if (a == (int) cos(pi * i/2)) ... 

はそれを行うことができます。式はの割り当てられた値に評価された場合

また、

printf("% d", 1); 

printf("%d", 1); 
/*  ^no space here */ 

と本当に、

printf("1\n"); 
+0

私が知りたいのは、出力が「101」である理由です。 – Midhun

+4

今、あなたはそれを見つける方法を知っています、それはより良いと思いませんか? –

1

ザ・なければなりません。この場合、aはintとして宣言されているため、切り詰められるため、1より小さい値は0と評価されます。つまりfalseです。 cos(x)-11、唯一の時間の間、常にあるのでx0あるかパイの倍数(cos(x)が正確1または-1に評価される時)場合、ブロックがある場合は入力します。

1

最初に、-2、-3,234,1、-9999 などのゼロ以外の値ごとにifブロックが実行されることを理解していますが、値0の場合はブロックは実行されません。 だから、forループ

ザ・が実行され、あなたのコードに来て3回I = 0、1、2

ためのI = 0:ブロック= 1のiについて

cos(pi * i/2) => cos(pi* 0/2) => cos(0) => 1 
if(a = cos(pi * i/2)) => if(a = 1) => if(1) 

を実行する場合:ブロックは、I = 2のための

cos(pi * i/2) => cos(pi * 1/2) => cos(pi/2) => 0 
if(a = cos(pi * i/2)) => if(a = 0) => if(0) 

を実行しない場合:ブロックは

を実行するかどうか
cos(pi * i/2) => cos(pi * 2/2) => cos(pi)) => -1 
if(a = cos(pi * i/2)) => if(a = -1) => if(-1)