2012-06-20 332 views
0

運營商++應該等同於+ 1,那麼爲什麼下面的示例會產生不同的結果?這些增量爲什麼會產生不同的結果?

#include <iostream> 
#include <string> 

int main() 
{ 
    int i, n=25; 
    std::string s1="a", s2="a", s1p="", s2p=""; 

    for (i=0;i<=n;i++) 
    { 
     s1p += s1; 
     s1 = s1.at(0) + 1; 

     s2p += s2; 
     s2 = s2.at(0)++; 
    } 
    std::cout << "s1p = " << s1p << "\n" << "s2p = " << s2p << "\n"; 

    return 0; 
} 

Ouput: 
s1p = abcdefghijklmnopqrstuvwxyz 
s2p = aaaaaaaaaaaaaaaaaaaaaaaaaa 
+0

我最近似乎有這種傾向,要求真正考慮不周的問題 - 也許我有一種潛意識希望等於「goesto-operator」的問題。,雖然這將需要做一些:) – slashmais

回答

9

後增量返回先前由變量保持的值。

想想x++後增量)作爲

int y = x; 
x = x+1; 
return y; 

++x預增)作爲

x = x+1; 
return x; 

要達到您想要的結果,你需要預先的增量。

+0

Aaah是的,令人驚訝的是如何明顯的東西滑倒...大聲笑 – slashmais

+0

鑑於他無論如何都覆蓋增量的結果,無論如何,我會質疑任務,或使用增量操作符(post或pre)。一個或另一個(取決於他想要什麼),但不是兩個。 –

+0

@JamesKanze我正在讀你的答案。 –

2

++和+1不等價。若要替換n++;,則必須使用n = n+1;(或如果需要,則爲n+=1)。 ++實際上遞增一個變量,而+1只是返回算術運算的結果。還要注意n ++和++ n有不同的行爲。

n = 1; 
i = 1; 

a = ++n; 
b = i++; 
c = i; 

的輸出A,B和C是

a: 2 
b: 1 
c: 2 
4

聲明:

s2 = s2.at(0) ++; 

是好奇的,至少可以這樣說。您在同一個 聲明中修改s2兩次。在內建類型中,這將是未定義的行爲;在 用戶定義的類型(如std::string),這只是令人困惑。並且因爲++的副作用必須發生在致電operator=, 之前,++實際上是無操作的;因爲 是無效的。任何 s2中字符的任何修改都會被賦值覆蓋。

如果你的目標是要指定一個全新的值的字符串,基於 它的第一個字符(和忽略任何其他字符可能 含),那麼你的s1修改是正確的解決方案。如果 您的目標是修改字符串中的第一個字符,並保留其他字符不變,則正確的解決方案僅爲 s.at(0) ++,++ s.at(0)s.at(0) += 1,而不進行任何分配。 (第二個是最地道的,當結果不否則 使用。)當然,如果你想建立字母表的連續 字符的字符串:

std::string s; 
for (char ch = 'a'; ch <= 'z'; ++ ch) { 
    s += ch; 
} 

將是最慣用的(即使它在形式上是錯誤的,並且不會在某些環境中工作:不能保證 字母的字母在編碼中佔據連續的碼點)。

+0

你說得對。我正在測試一個字符串散列函數,並希望運行從「a」到「ab」,「abc」,...,「a..z」的字符串以檢查衝突。我最初的嘗試是s2,這顯然不起作用,然後我切換到s1這很好。我非常喜歡散列函數,所以我沒有發現後增量的簡單錯誤解釋 - 這導致了這個有點令人尷尬的問題。 – slashmais

相關問題