为什么 ( ( cout << ptr; cout << "n" << ++ptr; )) 和 ( ( cout << ptr << "
why do (( cout << ptr; cout << " " << ++ptr; )) and (( cout << ptr << " " << ++ptr; )) give different results
我是 c++ 的新手,我最近花了几天时间阅读有关指针的信息。我意识到以下 2 个代码给了我不同的结果,尽管它们看起来相同。
第一个代码:
int a = 5;
int* ptr = &a;
cout << ptr;
cout << "n" << ++ptr;
第二个代码:
int a = 5;
int* ptr = &a;
cout << ptr << "n" << ++ptr;
这是第一个的输出:
0043F940
0043F944
第二个的输出:
003AFE20003AFE20
第一个对我来说似乎更合乎逻辑,因为它首先输出a
的地址,然后输出下一个整数位置的地址。但在第二个中,ptr
显然总是指向a
.
有人可以向我解释这种差异吗?
提前谢谢你。
仔细观察:cout << ptr << "n" << ++ptr;
您的代码就像f (ptr, ++ptr);
一样,具有相同的问题。
这两行代码有两个读取ptr
值的位置和一个写入ptr
值的位置。虽然读入++ptr
必须在写入之前进行,但读取ptr
(对于<< ptr
或要f
的第一个参数(对读取的时间没有限制,可以在写入之前或之后进行。
这是因为C++没有指定计算函数参数的顺序。显然,在您的平台上,使用编译器标志,增量恰好发生在另一个读取之前。因此,您可以输出两次递增的值。
现在让我们将operator<<(a, b)
命名为函数f(a, b)
。 使用此表示法cout << 5
变得f(cout, 5)
.利用<<
运算符具有从左到右关联性的事实,cout << 4 << "a"
变得f(f(cout, 4), "a")
。
让我们翻译您的代码:
cout << ptr << "n" << ++ptr;
自:
f(f(f(cout, ptr), "n"), ++ptr);
如您所见,对f
的最外部调用作为第二个参数++ptr
。由于 C++ 没有指定函数调用参数的计算顺序,因此在计算嵌套的函数调用之前,可以先递增ptr
f(...)
。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- std::cout.imbue()多重调用
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 在 COUT 语句中使用 COUT 调用函数
- GCC 4.8.2 自动矢量化由于 cout 而失败
- std::cout输出int时出现编译错误
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++标准::cout和<<操作员,优先级
- 以x的倍数填充前导零,使用std::cout<<std::十六进制
- 错误:没有匹配'运算符<<"在'std::cout
- 过载<<比如cout错误
- cout & lt; & lt;“text"只在部分时间显示
- 如何显示/打印字符串对象?cout & lt; & lt;Int工作,count <<字符串
- 我怎样才能到达cout<<"排序:";;当C++中没有输入数字时