[问题] 这时的cout<<里,为什么还可以印出1??

楼主: Zephyr750 (红莲西风750)   2017-09-25 18:48:00
开发平台(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 <
作者: dannypsnl (秦书)   2017-09-25 19:16:00
我猜啦,同一行决议顺序没有规定
作者: KKeiko   2017-09-25 19:17:00
作者: LPH66 (-6.2598534e+18f)   2017-09-25 19:18:00
一楼正解, 不过这在 C++17 将会改变, 会是预期的 2 了问题是在 << 运算子的左右两边没说谁先做https://wandbox.org/permlink/2cRJkP2imKVDTSys C++17
作者: jimfan (jimfan)   2017-09-25 22:21:00
如果你知道编译器会将 cout << a << b << c << endl; 扩张为一连串函数呼叫,就会明白原因将你的cout 简化成 cout << addOne(i) << i; 的话,大概会被编译成 <<( <<(cout, addOne(i)) , i);可见i初次被使用时,值未被addOne()变更这里还牵涉函数堆叠、以值/位址传入的概念,哗,C++很深奥
作者: LPH66 (-6.2598534e+18f)   2017-09-25 23:47:00
其实这里有点微妙, pre-C++17 的话这是对的但 C++17 新增的规定有特别把 << >> 两个运算子拉出来规定其算子的执行顺序, 所以不能单单展成函数呼叫(即使在新规定之下普通函数呼叫其参数执行顺序依然未指定)
作者: lovejomi (JOMI)   2017-09-26 06:18:00
c++17自己overload有办法写出满足规定的实作吗
作者: LPH66 (-6.2598534e+18f)   2017-09-26 08:44:00
唔嗯, 这跟你的实作相对无关, 而是在进你的函数之前计算参数的顺序问题; pre-C++17 没规定, C++17 定先左再右

Links booklink

Contact Us: admin [ a t ] ucptt.com