2017-04-27 39 views
1
#include <stdio.h> 
main() 
{ 
    int x = 1, y = 0, z = 5; 
    int a = x && y || z++; 
    printf("%d", z); 
} 

此代碼給我輸出:6C編程增量邏輯錯誤

#include <stdio.h> 
main() 
{ 
    int x = 1, y = 0, z = 5; 
    int a = x && y && z++; 
    printf("%d", z); 
} 

此代碼給我輸出:5

爲什麼第二程序給出輸出中爲5即使z爲遞增相同像第一個程序一樣?

+0

「||」和「|」之間的區別 與上面相同,在「||」的情況下,只執行一個語句,如果返回「true」,則其他語句不會執行。但是,如果第一個是錯誤的,那麼將檢查其他值是否爲「真」。原因是「或」運營商的工作方式。 「或」運算符僅依賴於一個真實的,換句話說,如果任何表達式都爲真,那麼結果將爲真。 –

+0

https://www.codeproject.com/Articles/662248/Difference-between-and-and –

回答

2

&&運營商(以及||運營商)是一個短路運營商。這意味着如果左操作數計算結果爲false,則無論右操作數如何,結果均爲false,因此不計算右操作數。左到右

不同於按位二進制&操作者,&&操作者保證評價;:

C standard第6.5.13如果第二操作數是 求值,則在第一和第二操作數的評估 之間存在序列點。 如果第一個操作數 的值等於0,則不計算第二個操作數。因此,在這個表達式的情況下

x && y && z++; 

x && y首先計算。由於x是1,y進行評估,發現是0,所以第一個&&的結果爲0。現在我們有:

0 && z++ 

因爲左操作數是0,正確的操作數未評估。這意味着z不會遞增。

這是在第一片的碼的對比表達:

x && y || z++ 

如前,x && y的計算結果爲0,留給我們:

0 || z++ 

由於左操作數是0,需要評估右操作數。這導致z增加。

3

x && y && z++由於y==0而在y之後停止評估。 z++未執行。

0

在此聲明

int a = x && y || z++; 

的初始化相當於

int a = (x && y) || (z++); 

根據C標準相對於邏輯OR運算符(6.5至。14邏輯或操作符)

4 ...如果第一個操作數比較不等於0,則第二個操作數是 未評估。

然而,(x && y)的第一個操作數等於0(由於變量y等於0)。因此第二個操作數(z++)被評估。

在此聲明

int a = x && y && z++; 

的初始化相當於

int a = (x && y) && (z++); 

根據C標準相對於所述邏輯AND運算符至(6.5.13邏輯與運算符)

4 ...如果第一個操作數等於0,則第二個操作數是 未評估

因此,當第一個操作數(x && y)等於0時,第二個操作數(z++)不被計算。