这是个好问题,
如果我们这样写的话:
#include <stdio.h>
int main()
{
char s[]="123",*p;
p=s;
printf("%c",*p++);
printf("%c",*p++);
printf("%c\n",*p++);
}
那么输出就会是理想中的“123”。
所以,为什么这道题的答案是B:321? 这要谈到printf函数(在大部分编译器中!!!!)是从右至左执行的。
我们稍微地做个示范:
#include <stdio.h>
int main()
{
char a = '1';
printf("%c%c%c\n",a++,a++,a++);
}
上面这段代码的运行结果为“321”,我们细说一下printf在这段代码是如何工作的:
printf("%c%c%c\n",a++,a++,a++); //.
首先我们看向最右边的a++, a的初始值为'1', 执行a++的时候会先返回a本身的值,然后再自增 (a++和++a是有区别的,题主如果不清楚的话可以上网查一下,如果已知道的话请忽略orz)
所以现在会变成这样:
printf("%c%c%c\n",a++,a++,'1'); //此时a的值是'2',因为a++会先返值后自增!
然后会变成这样:
printf("%c%c%c\n",a++,'2','1'); //此时a的值是'3'
最后会变成这样
printf("%c%c%c\n",'3','2','1'); //此时a的值是'4'
所以最终结果就是“321”啦!
如果这时我们再补一个printf("%c",a)的话会得到'4'.
知道printf(在某些编译器中!!!)的这个执行次序之后再回看题目应该就能够理解了!
-----更新----------------
楼下老哥补充得太好了,我用的GNU GCC编译器是从右至左的,上网查了一下,找到了关于编译器求值顺序的一篇知乎https://zhuanlan.zhihu.com/p/69699859
题目没有指明编译器的话出的这道题可能就略显...嗯,总之希望能够帮到题主
不要纠结于这种问题,出这个问题的人显然不太懂C/C++,才会喜欢搞这种没意思的玩意。
任何有着C/C++常识的人都知道,C/C++没有规定函数中参数的求值顺序,因此这个printf的行为是未定义的,213和321等等都符合标准规定(尽管多数实现是从右到左)。纠结这种低级问题毫无意义。
我专门查证了一下,https://stackoverflow.com/questions/12960241/explain-the-order-of-evaluation-in-printf 这里也认可我的说法,printf的很多实现是从右到左求值,但语言标准实际上并未对此进行任何规定。
补充:我找到了一个更一般的答案:https://stackoverflow.com/questions/9566187/function-parameter-evaluation-order
爱整这种UB题目还信誓旦旦说这是语法规定的,全世界都有,也别觉得国际上都有这么说的就是对的。建议:你目前在跟的如果是教材那赶紧换一本,如果是老师那建议以后对他的学术水平保持质疑的态度,趁早改为自学。
再补充:C++17似乎加强了对序列点的定义,有些UB已经不再是UB了。但C中似乎仍然是UB,从代码来看,你这个好像是C代码。同时上边的补充链接也值得一看,比我给出的这两个链接更具有针对性。