为什么这些增量会产生不同的结果?

时间:2012-06-20 07:02:50

标签: c++ increment

运算符++应该等同于+ 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

3 个答案:

答案 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