请对我很轻松,不要拍我,因为我还是新手。
我完全糊涂了,不能终身弄清楚为什么我运行这段代码时:
int y = 9;
cout << "++y = " << ++y << "\n--y = " << --y << "\ny++ = " << y++ << "\ny-- = " << y-- << "\n";
cout << "y = " << y << "\n";
我得到以下结果:
y = 9
++y = 9
--y = 9
y++ = 8
y-- = 9
y = 9
而不是这些结果:
y = 9
++y = 10
--y = 9
y++ = 9
y-- = 10
y = 9
我从这段代码中得到:
int y = 9;
cout << "y = " << y << "\n";
cout << "++y = " << ++y << "\n";
cout << "--y = " << --y << "\n";
cout << "y++ = " << y++ << "\n";
cout << "y-- = " << y-- << "\n";
cout << "y = " << y << "\n";
任何人都可以解释 - 尽可能简单的单词 - 第一个代码会发生什么,以便以这种方式打印结果?
答案 0 :(得分:11)
一个简单的规则是,您不应该在任何给定语句中多次增加相同位置。因此,您不应编写包含两个cout << y++ << ++y << endl;
增量的y
代码(假设int y;
声明)。
有关详细信息,请参阅 C ++ 标准中的序列点和未定义行为。
有很多相关的问题。仔细研究它们!
答案 1 :(得分:3)
当根据规则操作*要在+之前计数,而++之前是*时,它将是如此。
a*b++ + c // first b++ (returns **old** b), than a*b, than ...+c
但是当你有一个++ * a--,无人可以告诉你,两个操作数中的哪一个,a ++或a--将被评估为第一个。根据ANSII标准,即使您使用相同的翻译器,结果也是每次都无法预测。
引用C ++ ANSII标准:
除非另有说明,否则评估个人操作数的顺序 单个表达式的运算符和子表达式以及顺序 发生副作用的是未指明的。介于之间 标量和下一个序列点标量对象应存储它 通过表达式的评估,最多修改一次值。毛皮- 此外,只能访问先前值以确定 要存储的值。应满足本款的要求 对于每个允许的完整表达式子表达式的排序 - 锡安;否则行为未定义。 [实施例:
i = v[i++]; // the behavior is undefined
i = 7, i++, i++; // `i' becomes 9
i = ++i + 1; // the behavior is undefined
i = i + 1; // the value of 'i' is incremented
序列点:
所以,||是一个序列点,但是&lt;&lt;不是。
答案 2 :(得分:2)
第一个代码的Mulitiline版本应该是:
y = 9;
cout << "y-- = " << y-- << "\n";
cout << "y++ = " << y++ << "\n"
cout << "--y = " << --y << "\n"
cout << "++y = " << ++y << "\n"
cout << "y = " << y << "\n";