作者Zephyr750 (红莲西风750)
看板C_and_CPP
标题[问题] 这时的cout<<里,为什麽还可以印出1??
时间Mon Sep 25 18:48:00 2017
开发平台(Platform): (Ex: Win10, Linux, ...)
windows
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
visual studio 2008
win32 console
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
none
问题(Question):
add one: 2
add one return : 2
i: 1 <-----觉得它应该印2,但是却印1
lastest line: 2
喂入的资料(Input):
无
预期的正确结果(Expected Output):
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
http://cpp.sh/9qx6s
补充说明(Supplement):
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.239.248.77
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1506336485.A.6E6.html
1F:→ dannypsnl: 我猜啦,同一行决议顺序没有规定 09/25 19:16
3F:推 LPH66: 一楼正解, 不过这在 C++17 将会改变, 会是预期的 2 了 09/25 19:18
4F:→ LPH66: 问题是在 << 运算子的左右两边没说谁先做 09/25 19:19
6F:→ jimfan: 如果你知道编译器会将 cout << a << b << c << endl; 扩张 09/25 22:21
7F:→ jimfan: 为一连串函数呼叫,就会明白原因 09/25 22:21
8F:→ jimfan: 将你的cout 简化成 cout << addOne(i) << i; 的话,大概会 09/25 22:25
9F:→ jimfan: 被编译成 <<( <<(cout, addOne(i)) , i); 09/25 22:26
10F:→ jimfan: 可见i初次被使用时,值未被addOne()变更 09/25 22:29
11F:→ jimfan: 这里还牵涉函数堆叠、以值/位址传入的概念,哗,C++很深奥 09/25 22:31
12F:推 LPH66: 其实这里有点微妙, pre-C++17 的话这是对的 09/25 23:47
13F:→ LPH66: 但 C++17 新增的规定有特别把 << >> 两个运算子拉出来 09/25 23:47
14F:→ LPH66: 规定其运算元的执行顺序, 所以不能单单展成函数呼叫 09/25 23:47
15F:→ LPH66: (即使在新规定之下普通函数呼叫其参数执行顺序依然未指定) 09/25 23:48
16F:推 lovejomi: c++17自己overload有办法写出满足规定的实作吗 09/26 06:18
17F:→ LPH66: 唔嗯, 这跟你的实作相对无关, 而是在进你的函数之前 09/26 08:44
18F:→ LPH66: 计算参数的顺序问题; pre-C++17 没规定, C++17 定先左再右 09/26 08:45