2010-11-19 107 views
-2

我的朋友給我發了一個笑話:「C - C++」的笑話約後綴/前綴操作訂貨

問:什麼是C和C++之間的區別?

A.沒什麼,這是因爲:(C - C++ == 0)

我試圖改變順序和卡住了。

看看這段代碼:

public class Test { 
    public static void main(String args[]) { 
     int c = 10;   
     System.out.println(c++ - c); 
     System.out.println(++c - c);   
    } 
} 

爲什麼它返回:

-1 
0 

我明白後綴和前綴增量。爲什麼不是這樣的結果?

0 
1 
+4

發佈代碼nietherç也不是C++,請重新打 – 2010-11-19 18:05:10

+2

豬頭...罪什麼時候笑話完全符合事實?通過彎曲他們制定一些有趣的規則。如果你想從字面上理解,'C - C++'是未定義的行爲! – thecoshman 2010-11-19 18:13:54

+3

@thecoshman:在C或C++中它是,但不是所有使用類C語法的語言。 – 2010-11-19 18:14:34

回答

10

由於在第一個例子中,開始c出10. c++增量c和返回10,所以第二c現在計算爲11,因爲它是遞增。所以評估的最終表達式是10 - 11,其等於-1。

在第二個示例中,++c再次增加c,但返回12,因爲它是預增量。第二個c的計算結果也爲12,因爲它是存儲在c中的新值。使得表達最終被評價爲12 - 12,其等於0。

+0

這個答案是完全錯誤的。這兩個例子都有未定義的行爲。 – 2010-11-19 21:30:27

+2

在Java中?你確定嗎? – cdhowie 2010-11-19 21:35:34

1

所不同的是在使用操作員++ C和C++

C++將遞增的值之前,它是在計算中使用 ++Ç將遞增的值後,將其在計算

使用也cdhowie的回答解釋它更好

1

無論輸出0或-1用於第二所述第一和的println 0或1未定義。編譯器可以自由地首先評估左側或右側,因此在右側評估時增量是否已經生效取決於編譯器(事實上編譯器可以一次做一件事,而另一件事下一步)

增量只能保證發生在下一個sequence point。減法不是一個序列點。

編輯:Bah,寫這個答案時,問題被標記爲C/C++。 Sequence points don't apply to Java。我已經離開的情況下,其他人找到了答案有用考慮C/C++表達式時

+0

它不是未定義「是否爲第一個println輸出0或-1,第二個輸出是0還是1」。這是未定義的行爲。這意味着它可以打印0,-1,42,比「INT_MAX」大一些的數字,甚至會讓你的電腦爆炸。 – 2010-11-19 21:32:16

+0

是的。在實踐中,這將是我所說的選項之一。但你是正確的,你不能依靠這個 – 2010-11-20 13:44:11

2

因爲c++ - c變得(c - c-incremented-by-one),這是-1,++c - c成爲(c-incremented-by-one - c-incremented-by-one)由於增量之前執行它爲0

0

在一種情況下操作,而在另一種情況下操作後執行增量。

int c = 10; 
System.out.println(c); // output 10 
System.out.println(c++); // outputs 10 
System.out.println(c); // output 11 
System.out.println(++c); // output 12 
System.out.println(c); // output 12 
0

這就是後綴和前綴增量的區別。

這裏有一個很好的文本:

http://www.java-samples.com/showtutorial.php?tutorialid=249

「無論是增量運算符(++)和遞減運算符( - )有兩個品種:前綴和後綴,前綴品種寫在變量名之前(++ myAge);後綴變量寫在(myAge ++)之後

在一個簡單的語句中,你使用的並不重要,但是在一個複雜的語句中,當你遞增時(或遞減)變量,然後將結果賦值給另一個變量,這非常重要。前綴運算符是在賦值之前評估,後綴在之後被評估。

前綴的語義是這樣的:增加值,然後獲取它。後綴的語義是不同的:獲取值,然後增加原始值。

這可以在第一是混亂的,但如果x是一個整數,其值在5和你寫

INT A = ++ X; 你已經告訴編譯器增加x(使其爲6),然後獲取該值並將其賦值給a。因此,現在是6和現在x是6

如果這樣做之後,則寫

INT B = X ++; 您現在已經告訴編譯器獲取x(6)中的值並將其賦值給b,然後返回並遞增x。因此,B現在是6,但,x是現在低於7清單示出了兩種類型的使用和含義。」

0

我用這個C++代碼

原因很簡單。++運算符進行復印var增加值,然後返回複製的val假設操作符從左到右計算,它將通過10-10(然後是C),因此它總是0.然而,在大多數情況下,依賴於順序是'未定義的行爲',並且像GCC編譯器的一些會報告警告(例如http://codepad.org/UPBqO38B

int main() 
{ 
int c=10; 
printf("%d", c-c++); 
}