2017-03-21 33 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或pi的倍數時(cos(x)將評估準確1-1),你會進入。

1

首先明白if塊將對每個非零值執行,如-2,-3,234,1,-9999, ,但對於值0,塊將不執行。 所以來你的代碼,

for循環運行三次 I = 0,1,2

對於i = 0:如果塊將執行

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

對於i = 1:如果塊將不執行

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

對於i = 2:如果塊將執行

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