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

Why do these increments give different results?

本文关键字:结果 为什么      更新时间:2023-10-16

运算符++应该等效于+ 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前增量)作为

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 
相关文章: