为什么这些增量会产生不同的结果
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
(前增量)作为
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
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么这个程序的结果是3 "born"?和 4 死
- 为什么在递归中使用循环会产生意想不到的结果?
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 为什么第二个代码给出了预期的结果,而第一个代码却没有?
- 为什么组合的上限和下限比较的计算结果总是为 true?
- 为什么这两段使用 constexpr、__PRETTY_FUNCTION__ 和 char * 的代码有不同的结果?
- C++向量与 C# 列表.为什么它们会产生不同的结果?
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 为什么函数 tellg() 没有返回好的结果?
- 双摆返回楠结果.为什么?
- 相机校准结果:为什么与输入相似
- 按回车键后,程序没有输出任何结果.为什么会这样
- 两个明显相似的函数给出了不同的结果.为什么
- 顺序和并行版本给出不同的结果 - 为什么
- 按位运算的意外结果 为什么 (1 | 1 & 2) 给出 1 而不是 2?