[英]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;
和++x
( pre-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.