【发布时间】:2017-10-05 13:34:29
【问题描述】:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a = 5;
int& b = a;
int* c = &a;
cout << "CASE 1" << endl;
cout << "a is " << a << endl << "b is " << b << endl << "c is " << *c << endl;
b = 10;
cout << endl << "a is " << a << endl << "b is " << b << endl << "c is " << *c << endl << endl;
cout << "CASE 2";
a = 5;
cout << endl << "a is " << a << endl << "b is " << b << endl << "c is " << *c << endl;
b = 10;
cout << endl << "a is " << a << endl << "b is " << ++b << endl << "c is " << *c << endl << endl;
cout << "CASE 3";
a = 5;
cout << endl << "a is " << a << endl << "b is " << b << endl << "c is " << *c << endl;
b = 10;
cout << endl << "a is " << a << endl << "b is " << b++ << endl << "c is " << *c << endl;
}
输出:
案例 1:
a is 5. b is 5. c is 5.
a is 10. b is 10. c is 10.
案例 2:
a is 5. b is 5. c is 5.
a is 11. b is 11. c is 10.
案例 3:
a is 5. b is 5. c is 5.
a is 11. b is 10. c is 10.
我理解 CASE 1。但我很难理解 CASE 2 和 CASE 3。有人可以解释为什么 c 在这两种情况下都没有更新新值吗?
【问题讨论】:
-
可以添加输出吗
-
<<的运算顺序未定义。简单地说,operator <<是一个函数,这些是它的参数。函数的参数可以按任何顺序评估,因为它是实现定义的。 -
看起来像未定义和/或未指定的行为。甚至可能取决于所使用的 C++ 标准版本。排序规则和运算符优先级的规则几乎是非常复杂的,请参阅en.cppreference.com/w/cpp/language/eval_order 和en.cppreference.com/w/cpp/language/operator_precedence。为了避免所有这些麻烦,我个人的规则是永远不要访问在同一表达式中应用了
++的对象。
标签: c++ pointers operator-precedence