2013-07-25 16 views
1
int main() 
{ 
    int var1=4, var2=6; 
    var2=var2||var1++&&printf("computer world"); 
    printf("%d%d",var1,var2); 
    getch(); 
} 

打印的答案是41正在使用邏輯運算符的c程序

問題:
這裏不是打印'計算機世界'。 根據優先順序,我們必須計算&&邏輯運算符,但這裏的行爲不一樣,和var1值應該是語句後增加,但沒有。 我預期的答案是computer world51

+1

這是最近的至少一個問題的副本,以及可能的幾個年長那些。這是一個優先與執行順序的問題。 –

+0

您只需將源代碼複製粘貼到Google中即可。你可以找到多個網站有相同的問題。 –

+1

[運算符優先級問題]的可能重複(http://stackoverflow.com/questions/7212482/problem-with-operator-precedence)。另一個是[爲什麼低優先級運算符首先執行](http://stackoverflow.com/questions/12152143/why-lower-precedence-operator-executes-first)。 –

回答

6

這就是所謂的「優先級」,而不是「優先」。 優先順序與評估順序不同。

由於||&&運營short-circuit,和VAR2被認爲是真實(因爲圖6是非零),既沒有增量後操作也不函數調用進行了評價。

+0

+1你的鏈接速度相當快:)。而你花了15秒鐘來更好地解釋它。 – 0decimal0

+0

+1用於短路評估 –

0

||是短路操作者如果第一個操作數的值爲true它不進一步執行。

所以var2變爲1(因爲VAR2最初6,操作結果爲true),並沒有增量發生如此var1仍然4.

0

||是短切的,所以在語句:

var2=var2||var1++&&printf("computer world"); 

由於var具有6一個值,該值評估爲真,後者表達var1++&&printf("computer world");將不被執行。

1

||運營商檢查的第一個值是。如果它是真的,那麼它不會評估邏輯表達式的第二部分,因此printf語句沒有輸出文本。這稱爲短路操作。

下面的代碼給出了預期的結果

#include<stdio.h> 

int main() 
{ 
    int var1=4,var2=0; 
    var2=var2||var1++&&printf("computer world"); 
    printf("%d%d",var1,var2); 
    getch(); //remove getch if you are working on gcc 
} 
+2

它也不執行'var1 ++'。 –

+0

Sir @JonathanLeffler我做了上述改變,它按預期工作。 –

+1

我不確定我是否應該詢問相關的「預期」行爲。由於'var2'爲0(false),所以你的代碼段應該打印'computer world51',所以後增量發生,但返回的值是4(前增量值),所以'&&'條件需要評估函數,它輸出「計算機世界」並返回14,即打印的字符數。因此,整體表達式的計算結果爲1(false),並且'var2'被賦值爲1,從而得到值'var1 == 5'和'var2 == 1'。在第二個'printf()'格式末尾應該有一個換行符來獲得理智的行爲。 –

1

var2||var1++&&printf("computer world")將被計算到:

var2||( var1++&&printf("computer world") ) 

如此以來VAR2不爲零,||畢竟部分將被忽略。

所以結果是正確的。這是1,它將被分配給var2。

0

的樂趣:

#include"stdio.h"                                       
    main() 
    { 
     int var1=4,var2=6; 
     var2=printf("step1")&&var2||printf("step2")||var1++&&printf("step3"); 
     printf("%d%d\n",var1,var2); 
     var2=printf("step1")&&var2&&printf("step2")||var1++&&printf("step3"); 
     printf("%d%d\n",var1,var2); 
     var2=printf("step1")&&var2&&printf("step2")&&var1++&&printf("step3"); 
     printf("%d%d\n",var1,var2); 
     // getch(); 
    } 

結果是:

step141

step1step241

step1step2step351