刷题时遇到printf,关于这个顺序之前还没注意过,经过一番测试,得到下面的结论,欢迎指点讨论。
int main(void)
{
int arr[] = { 6, 7, 8, 9, 10 };
int* ptr = arr;
*(ptr++) += 123;
printf("%d %d %d %d", *(ptr++), *ptr, *(ptr++),*ptr);
int m = 0;
printf("\n\n\n%d %d %d %d %d\n",m, m++,m,++m,m++);
return 0;
}
第一:printf从右往左执行。之前的ptr指向arr[1]=7;
第二:最右侧*ptr不需要执行,直接保持不变,*ptr;
第二个,先引用,后++;所以解引用得到的值为7;(ptr指向arr[2]了);
第三个,同第一个,不变,就是*ptr;
第四个,先引用,后++;得到的值为arr[2]=8;(ptr指向arr[3]了);
然后,得到的是8,*ptr,7,*ptr。执行完第四步,ptr指向arr[3]=9;
所以,输出8 9 7 9;
第三:道理同上,
最右侧 取得值为0;(m=1了)
第二个,m;(m=2了);
第三个,m;
第四个,取得值为2,(m=3了);
第五个,m;
最终,m,2,m,m,0; 这时m=3;
所以输出,3 2 3 3 0;
结论就是,从右往左执行,有需要先取值后执行的,直接就获得值。其余的都是执行完以后,统一取值。
感觉好无聊,谁会这么写代码。。。
(来自VS2019,如有误请指导)