这两段代码在VC和DEV C++上结果不一样,该如何处理
这两段代码在VC和DEV C++上结果不一样DEV上的结果我可以理解,但是VC是怎么做的?高手可以给一个能表达出cou
这两段代码在VC和DEV C++上结果不一样
DEV上的结果我可以理解,但是VC是怎么做的?高手可以给一个能表达出
cout << (*p)++ << ' ' << *(p++) << endl;
的式子么?
C/C++ code#include<iostream.h>int main(){ int a[] = {2,4,6,8,10}; int *p = a; int i; cout << (*p)++ << ' ' << *(p++) << endl; for(i = 0;i < 5;i++) { cout << a[i] << ' '; } getchar(); return 0;}
[解决办法]又是++的问题,这个与编译器有关的,日经贴
参考:
http://topic.csdn.net/u/20110826/09/601EBE9C-C2AE-4D63-A4E2-506C618BB654.html
[解决办法]ISO/IEC 14882:2011(E)
5.2.2 Function call
8 [ Note: The evaluations of the postfix expression and of the argument expressions are all unsequenced relative to one another. All side effects of argument expression evaluations are sequenced before the function
is entered (see 1.9). —end note ]
c++11对此的规定和c++03一样的
[解决办法]研究C++, 但是不要纠缠在这些 "++"上.
[解决办法]我觉得这边的问题是结合性问题,不是 前面引用的标准的计算顺序的问题 或者顺序点的问题。
cout << (*p)++ << ' ' << *(p++) << endl;
=》cout.operator << ((*p)++).operator <<( ' ').operator<< (*(p++)).operator << (endl);
也就是可以抽象成,函数调用的结合性问题。
classA.functionB(b).FunctionC(c);
# 函数调用(.运算)的左右操作数的计算顺序才是 上述标准所说的计算顺序未定义的吧。
而函数调用 应该是从左向右结合的,个人理解输出应该是2,2
但 vs2005的实际结果是 4,2
从结果来推断
1 首先 是 右结合的
2 并且函数调用(.运算)的右操作数(参数)的计算顺序 先于 左操作数(classA.functionB(b))
3 在标准要求的 顺序点(这边应该是进入函数体) 之前 就已经可以去到p的最新值。
写的比较乱,不知道理解对不对