簡體   English   中英

為什么這些增量會產生不同的結果?

[英]Why do these increments give different results?

運算符++應該等於+ 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

后增量返回變量先前保留的值。

x++后增量 )視為

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

++xpre-increment )為

x = x+1;
return x;

為了獲得理想的結果,您需要預先增加。

該聲明:

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;
}

會是最慣用的語言(即使這是形式上的錯誤,並且在某些環境中也不會起作用:無法保證字母表中的字母在編碼中占據連續的代碼點)。

++和+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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM