2011-04-02 95 views
3

我在Objective-C中有一些簡單的代碼,包含一個按鈕和一個標籤。當你點擊一次按鈕時,標籤顯示:「你打我了」,如果你點擊了兩次,信息將會是:「我再次嘗試了」。但是,如果你按下5倍或更多的按鈕,信息應該是:「停止那個」;爲什麼++運算符將整數增加4而不是1?

我使用簡單的if s和使用運算符++增加的計數器。問題是:我的櫃檯增加了4步,而不是一個步驟。

下面的代碼

@implementation hitMe 

NSString *myString = @""; 
int *counter = 0; 

- (IBAction)htM:(id)sender { 
    if ([myString isEqualToString:@""]){ 
     //first hit 
     myString = @"u hit me"; 
    } else { 
    // second and next hits... 
     myString = @"u did it again!"; 
     counter++; 
    } 

    // if I use "counter > 5" it doesn't work, 
    // I have to use 21 if I want the button hit 5 times before 
    // I get the "STOP THAT" message 

    if (counter > 21) { 
     myString = @"STOP THAT "; 
    } 

    [labelOne setStringValue:myString]; 

    // I used this only to check the count value 
    [labelTwo setIntValue:counter]; 
} 

@end 
+1

你對* what * languages完全有經驗嗎?假設'++'運算符是C-ism,而不是Objective-C-ism,我猜這不是C/C++家族樹中的任何東西。 – 2011-04-02 06:57:08

+1

另外,一些Objective-C提示:類名是駱駝大小寫。方法名稱通常具有很強的描述性,不會使用縮短的方法或變量名稱,如* htM *而不是* hitMe *。我們也不關心你的經驗水平,無論是初學者還是專家,所有程序員都歡迎使用stackoverflow。 :) – 2011-04-02 07:52:00

+0

對不起,如果我用我的英語冒犯了U!這不是我的母語,不幸的是我必須將它作爲學習工具... 我相信,這不是重點... 只要你知道,我很清楚如何命名我的功能,但是,當我做一個「hitme」測試程序時,只是爲了學習obj-c的合成,我沒有必要很好地命名我的兩個函數...... PS:其他函數之前稱爲「hitMe」 ...... – 2011-04-02 18:06:37

回答

21

你遞增,counter變量,是一個指針爲int,而不是一個int。所以編譯器開啓:

counter++; 

counter += 4; // sizeof(int) == 4 

這是需要什麼來獲得內存中的下一個單詞,或者你可能指向下一個位置。這看起來很奇怪,但是如果你有一個ints和一個你用來檢查它們的指針,增加指針會帶你到下一個int(在大多數體系結構中這是四個字節)。

更改int *counterint counter,你應該沒問題。


編輯:C語言規範定義指針運算這種方式,因爲指針數學中最常見的用途是圍繞着你指向一個數組導航(當您添加或減去的指針會發生什麼)。因此,指針的一個增量單位是該陣列的一個單位,即sizeof(arrayType)。 char *會給你你期望的行爲,因爲sizeof(char)是1.

+1

@Diego Favero:'爲什麼會發生?'因爲64位int是4個字節。如果'int * x'指向一個mem位置,則遞增x會將指針遞增爲64位int。因此+4字節。 – dawg 2011-04-02 18:06:42

+0

嗨,Seamus Campbell!這很好,它一直工作得很好!但現在,我得到了其他的追求:爲什麼會發生? : 「所以編譯器變成:counter ++; into counter + = 4;」 ,因爲我也試過「counter = counter + 1」並得到了相同的結果 – 2011-04-02 18:14:09

+1

看到我上面的編輯。這只是指針數學在C中的工作方式。它全是加法,而不僅僅是++。 – 2011-04-02 20:08:11

相關問題