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
4

3 回答 3

9

后增量返回变量先前保存的值。

x++后增量)视为

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

++x( pre-increment ) 为

x = x+1;
return x;

为了达到你想要的结果,你需要预先增加。

于 2012-06-20T07:03:36.080 回答
4

该声明:

s2 = s2.at(0) ++;

至少可以说是好奇。您s2在同一个语句中修改了两次。在内置类型上,这将是未定义的行为;在用户定义的类型(如std::string)上,它只是令人困惑。并且因为 ++ 的副作用必须在调用 之前发生operator=,所以++实际上是无操作;对 in 任何字符的任何修改都会 s2被赋值覆盖。

如果您的目标是根据字符串的第一个字符(并忽略它可能包含的任何其他字符)为字符串分配一个全新的值,那么您的修改s1是正确的解决方案。如果您的目标是修改字符串中的第一个字符,而保留任何其他字符不变,那么正确的解决方案是简单的 s.at(0) ++,++ s.at(0)s.at(0) += 1, 没有任何赋值。(第二个是最惯用的,当结果没有被使用时。)当然,如果你想建立一个字母表中连续字符的字符串:

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

将是最惯用的(即使它在形式上是错误的,并且在某些环境中不起作用:不能保证字母表中的字母在编码中占据连续的代码点)。

于 2012-06-20T07:27:24.853 回答
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 
于 2012-06-20T07:23:19.550 回答