簡體   English   中英

無法理解此if語句

[英]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)

我不知道這是在尋找什么,我唯一的假設就是它永遠都是真實的。 我說的對嗎?

該任務有兩個目標:

  • 以顯示C中的布爾值:本質上,它們的計算結果是整數,其中錯誤映射為0,真實映射為1。反過來,可以在整數上下文中使用任何數字或指針值,並使用各自的零值(0、0.0, NULL(指針),0.0f,0L等)評估為false,所有其他評估為true。
  • 展示運算符的優先級

&&的優先級高於|| ,因此此語句等效於

a-2 || (b&&c) || a

這將計算為true ,如果任何值是真實的。

作為a==2a-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM