C语言选择题,求详解

以下程序的输出结果是()。
main()
{ char s[]=“123”,*p;
p=s;
printf(“%c%c%c\n”,*p++,*p++,*p++);
}
A.123 B.321 C.213 D.312

应该选B。

程序结果:

解析:

    *p 表示p是一个储存地址的变量

    在这个程序中当运行完p=a;时,*p为"1",*p++也为"1"

    *p++和*(p++)相同

    printf的运行顺序是从左到右

    *p++是把*p存储的地址+1,而p的存储地址是数组的第一个,所以相当于把p的指针往后移一位,也就是说把p指向的数组的位置往后移一位。所以就是321

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-01-11

答案就是A,说B的上个运行结果截图啊

后自增是先使用再增加。

p开始指向字符数组第一项 s[0]。

修改一下,编译器不同结果不同。

追问

怎么解释,题目后的答案写的也是B

追答

补了两个图,和编译器有关。
同是开源自由的clang和gcc编译的结果都不一样

第2个回答  2019-01-11

321 选B

p指向字符串s首地址

那个调用函数是从右到左执行的 所以先执行最右边的*p++ 得到1

函数的参数压栈是从右向左执行的……

第3个回答  2019-01-11
数组指针没有任何变化,输出都是111。。
因为指针p是指向了第一个字符1,而%c是读入并打印出来一个字符。。而printf中*p意思是s[]第一个值,读入到打印函数,打印到屏幕完了然后把这个读入值+1,而数组指针值还是没有变的,总是指在1的位置。
可以用下面更改程序验证:把其中一个变成前++
#include<stdio.h>
main()
{ char s[]="123",*p;
p=s;
printf("%c,%c,%c\n",++*p,*p++,*p++);
}
++*p,读入数值+1·,最后结果是2,1,1。。说明*p只是第一个字符值,而原数组指针是没有变化的。
第4个回答  2019-01-11
答案:A.123
详解:首先题目定义了一个字符数组s,其中存放了字符串"123",随后定义了字符型指针p,并且使p指向字符串s.
之后,题目开始输出结果,注意输出方式*p++,这是本题关键所在,根据运算符结合顺序,先输出*p,也就是字符串第一个字符"1",之后执行p++,指针后移指向字符"2",之后的两次输出同理。
希望能帮助到你。追问

错了,答案是B,而且我运行了也是321,所以答案没错,但是不知道为什么是321

追答

我运行出来就是123啊。

相似回答