#include
#include
using namespace std;
static int a[9] = { 1,3,5,7,11,13 };
int main()
{
int* p;
p = a + 3;
cout << *p << endl<<(*p++) << endl;
cout << *(p - 2) << endl << *(a + 4) << endl;
return 0;
}
不同编译器对于符号的优先级并不一致
vs里*p++等于*(p++)
而code里*p++等于(*p)++
所以别总学c语言考试里的写法,各种表达式里放++
实际项目中,一定要把++操作和表达式分开写
array.cpp:8:28: warning: unsequenced modification and access to 'p' [-Wunsequenced]
cout << *p << endl<<(p++) << endl;
~ ~~~~
这是使用clang编译时的编译警告,表示这两个表达式对p的修改并未被排序。意思是编译器对于连续的 << 运算符而言,p 与 (*p++) 属于同一优先级。不存在严格的求值顺序。所以会因编译器在求值顺序的实现不同而不同。属于语言标准对求值顺序的未定义行为。
类似的,像
int a = 56;
cout << a++ + ++a + a-- << endl;
cout << a++ << ++a << a-- << endl;
都会因编译器实现而不同。这种用法要尽量避免。
在谭浩强的c语言设计中为了考试而使用的题目属于典型的毒瘤了