运算符++
应该等同于+ 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 :(得分:9)
后增量返回变量先前保存的值。
将x++
(后增量)视为
int y = x;
x = x+1;
return y;
和++x
(预增量)为
x = x+1;
return x;
要获得所需的结果,您需要预先增量。
答案 1 :(得分: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;
}
将是最惯用的(即使它是正式错误的,也不会 在某些环境中工作:不能保证信件的字母 字母表在编码中占据连续的代码点。
答案 2 :(得分: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