2016-05-03 45 views
0

我已經在下週舉行的C大學考試,我在看舊的考卷,其中一個問題給出了這個零碎的代碼片段。不能理解這個,如果陳述

int a=2, b=-1, c=0; 

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

    printf("True\n"); 

    } else { 

    printf("False\n"); 

    } 

我們必須確定這個代碼的輸出將是什麼,但如果聲明沒有意義,我的任何聲明,如果我遇到已經非常具體就像說

if(x == 0) 

我不知道這是在尋找我唯一的假設,那就是它永遠是真的。我是對的還是有更多的呢?

+7

請注意,最後一個例子('if(x = 0)')是一個賦值,並且if語句的主體永遠不會被執行。也許你有'if(x == 0)'的想法。 –

+2

檢查['C'運算符優先級](http://en.cppreference.com/w/c/language/operator_precedence)的文檔。它也鏈接到每種類型的'C'運算符的描述頁面。 – axiac

+1

if語句包含一個表達式,並且需要考慮運算符優先級來評估它。如果它評估爲0,那就錯了,否則它是真的。 – JeffRSon

回答

12

這項任務有兩個目標:

  • 顯示什麼布爾在C:最根本的是評估與假映射整數爲0,真正的映射到1反過來,任何數字或指針值可以在整數上下文中使用,其中各自的零值(0,0.0,NULL(指針),0.0f,0L等)評估爲假,其他評估爲真。
  • 顯示運算符的優先

&&||的優先級高,所以這種說法是相當於

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

將評估爲true如果任何值是真實的。

由於a==2,a-2爲0. c爲0,因此b && c也爲0。

因此,我們必須0 || 0 || a,爲a爲2

+0

'0.0'和'0.0f'也評估爲false。 – EOF

+1

*任何*值爲零的類型都會計算爲false,即使是一個指針。儘管C99引入了布爾值作爲特定類型。 – cdarke

+0

你是對的,但我的意圖是顯示相反的方向。但我現在編輯了我的答案,以顯示兩個方向。 – glglgl

0
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"); 

    } 
2

大多數語言解釋非零整數爲真正和零,所以在這裏你將不得不計算方面的每一個。沒有任何括號,我會建議the && statement is taken in account first。因此,我們有:

if (2-2 // gives zero 
|| // OR 
-1 && 0 // -1 AND 0 gives false 
|| // OR 
a) // Which is 2, which is true 

所以,你說得對,這句話永遠是。這個練習是關於顯示先前的順序,以及即使在布爾邏輯中,一切都是數值的事實。 這對你的理解非常重要。

如果predecence是周圍的其他方式(||> & &),你必須明白,它會一直代替。我認爲這個例子的重點在這裏。

(a-2 || b) && (c || a) 
false && true 
--> false 
1

Ç語言整數0作爲任何非零整數值處理是真正但應該指出的是,特定的語言和中小企業賬單會顯示編譯錯誤Java作爲java更嚴格,整數不轉換爲布爾值。

談到上述分配問題內部if語句將評估爲true作爲 (a-2||b&&c||a)表達式是相同 (2-2||-1&&0||2)這是作爲 (0||0||2)相同,其被評估爲 (false||false||true)並因此整個表達式的計算結果爲 true希望它有幫助

0

你需要解決這個問題,那就是 運算符優先級和 關聯運營商的

運算符優先級告訴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 
-1

在幾乎所有的編程語言,我知道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。

+0

你的第一句話錯了:在Java中,例如,爲了得到一個布爾表達式,你必須顯式比較0。 – glglgl

+0

這就是爲什麼我說幾乎所有的編程語言,包括C,C++和排除Java等,幾乎每一個之間有很大的區別,我希望你明白我的觀點。 –