2017-05-29 102 views
-1
void main() 
{ 
int i=4,j=12; 
if(i=5 && j>5) 
    printf("Hi!"); 
else 
     printf("Hello!"); 
} 

首先,上面代碼的輸出是Hi!。根據我的說法,它應該顯示一個語法錯誤,因爲i = 5是一個assingment operator not i == 5 if我== 5然後它也是假的,應該打印你好,但它怎麼能打印嗨?if else condition with and operator

+4

'!!(i = 5)== true'這就是爲什麼。 – 0andriy

+1

爲什麼你忽略編譯器警告?如果你的編譯器不警告,立即得到一個現代編譯器!正如你所說:「'='是一個賦值**運算符**」 – Olaf

回答

0

i=5是一個非常有效的表達式,可以放入條件式中,即使它不是對等式的測試。該分配產生的值不爲零,因此條件仍然正確。

+0

然而編譯器會發出警告...... –

+0

@EugeneSh。一些編譯器會。雖然沒有保證。 –

+1

請注意,由於運算符的優先級,「i = 5」不在OP代碼中評估;而'5 && j> 5'的結果被分配給'i'。 –

5

在if語句

if(i=5 && j>5) 

的條件等價於

if(i = (5 && j>5)) 

正如圖5是不等於0和j是確實大於5,則表達式(5 && j>5)的計算結果爲1和是分配給變量i

從C標準(6.5.16賦值運算符)

3賦值運算符存儲在由 左操作數所指定的對象的值。 賦值表達式具有左 操作數的值分配後...

所以作爲可變i的值等於1那麼如果執行條件。

看來你的意思是

if(i==5 && j>5) 
    ^^^^ 

考慮到,根據C標準不帶參數的功能主要應聲明如下

int main(void) 
+1

適合指出可能是分配給'i'的意外值。 –

0

可以在條件參數賦值的變量,比如

帳戶
While((a=b)!=null){ 
    ... 
) 

嘗試輸出每個變量(i,j)看看發生了什麼