[英]Can't understand this if statement
下周我要參加一門C大學考試,我在看舊的試卷,其中一個問題給出了這些零碎的代碼。
int a=2, b=-1, c=0;
if (a-2||b&&c||a){
printf("True\n");
} else {
printf("False\n");
}
我們必須確定這段代碼的輸出是什么,但是if語句對我來說毫無意義,我遇到的if語句非常具體,例如說
if( x == 0)
我不知道這是在尋找什么,我唯一的假設就是它永遠都是真實的。 我說的對嗎?
該任務有兩個目標:
&&
的優先級高於||
,因此此語句等效於
a-2 || (b&&c) || a
這將計算為true
,如果任何值是真實的。
作為a==2
, a-2
為0。 c
是0,所以b && c
是0,以及。
所以我們有0 || 0 || a
0 || 0 || a
0 || 0 || a
,與a
為2相同。
大多數語言將非零整數解釋為true ,將零解釋為false ,因此在這里您必須計算每個項。 如果沒有任何括號,我建議首先考慮&&語句 。 因此,我們有:
if (2-2 // gives zero
|| // OR
-1 && 0 // -1 AND 0 gives false
|| // OR
a) // Which is 2, which is true
所以你是對的,這個說法永遠是正確的 。 該練習旨在顯示優先順序,以及所有內容都是數字的事實,即使是布爾邏輯也是如此。 這對於您理解非常重要。
如果優先順序與(||> &&)相反,那么您必須了解它原來是錯誤的 。 我認為這個例子的重點就在這里。
(a-2 || b) && (c || a)
false && true
--> false
您需要了解,C語言中的真理和虛假始終是數字。
https://www.le.ac.uk/users/rjm1/cotter/page_37.htm
即,任何數值為零的結果都是假,而任何數值為非零的結果都是真。
在c語言中,整數0被視為false,並且任何非零整數值均為true,但應注意,它是特定於語言的,並且sme語句將在java中顯示編譯錯誤,因為java更嚴格,並且整數未轉換為布爾值。
談到上述分配問題的表達式內if語句將評估為true
作為(a-2||b&&c||a)
是相同(2-2||-1&&0||2)
其是相同(0||0||2)
評估為(false||false||true)
,因此整個表達式的評估結果為true
。 希望對您有所幫助 。
int a=2, b=-1, c=0;
int first=a-2; //0 -> false
bool second= b&& c; // nonZero&&zero -> true&&false -> false
int third = 2; // nonZero -> true
// false|| false|| true -> true
if (first || second || third ){
printf("True\n");
} else {
printf("False\n");
}
解決此問題之前,您需要了解兩件事,即運算符優先級和運算符的關聯性
運算符優先級告訴c編譯器首先要執行哪個操作。 並且如果兩個運算符的優先級高於關聯性,則表示在表達式中從左到右或從右到左求值
int a=2, b=-1, c=0;
if (a-2||b&&c||a){
你可以認為是
if((a-2)||(b&&c)||a){}
means - has top precedence so it will solved first
reduced to if(0||(b&&c)||a){}
then && has higher precedence so
reduced to if(0||false||a)
then the associativity is left to right so
reduced to if(false||a)
that is(false||2)
return true
據我所知,幾乎在每種編程語言中,0表示錯誤,1表示正確。
因此,提出您的問題:您已使用&&
和||
操作員。 這兩個都稱為邏輯運算符。 現在,您的第一個塊是a-2||b :- 2-2||-1
所以0||-1
。 現在,由於||
的正確表達 如果為-1
則or運算符將返回1,即True,因為0和-1的值之一為非零0,即-1。
因此該表達式解析為1&&c||a
:-
現在c=0
,因此1&&0
返回0,因為&&
僅在其左右兩個表達式都不為零時才返回1。 因此表達式變為0||2
:-
現在||
(或運算符)僅要求右側或左側的操作數之一為非零,因此0 || 2返回1。
現在,您的if (a-2||b&&c||a)
語句解析為
if (1)
{
printf("True\n"); }
else......
因此,由於1表示TRUE,因此if語句將執行,您將獲得輸出為True。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.