C语言入门,求下图程序输出结果,为什么,谢谢

2025-04-24 18:44:17
推荐回答(4个)
回答1:

其实楼上都没有说到重点上面我来告诉你关键点

3个知识点你记住了:运算符优先级别循环语句(for)的控制范围 ,指针于数组的关系

你要清楚一点,你的for没有大括号“{}” 这也就意味着每一次的循环只作用于它下面的那条最近的语句 什么是语句?  就是以分号结束的(至少你写的这个就只作用于a[i] = *p++;  这一个语句   当然还有其它情况这里就不说了怕你乱)   那么也就是说这里的for循环整体上看会执行4次对吧?   i 的值会从0~3对不对? (最后一次1=4时跳出循环了) 那么也就意味着  a[i] = *p++;这一语句也会执行4次看下面 

这些说的就是for的作用范围的问题,不加大括号就是默认控制一个语句,加了大括号就是大括号里面的整个都控制(这里说的控制是说for循环语句循环一次它控制的语句也会跟着执行一次)

a[i] = *p++;
a[i] = *p++;
a[i] = *p++;
a[i] = *p++;
等价于
a[0] = 2;
a[1] = 4;
a[2] = 6;
a[3] = 8;

//你应该郁闷为什么上的 *p++ 依次变成2,4,6,8 至于i为什依次变成0,1,2,3 不用解释了吧
那么接下来就就涉及运算符优先级别的问题那么一 一来看

  • *p++  :根据运算符的优先级我们知道这里有2个运算符分别是* 和++ 那么++优先级比*要高(因为这里++前面有个p  ,  所以++ 现在属于后戳运算性质 ,其实就是说出现在一个变量的后面例如题中的p++, 那么像++p就属于前戳运算了, 前戳比后戳优先级别低一点 ) 那么++结合方向为从右至左 所以先计算p++ 此时++是后戳那么p的值只有在下一个语句中才会+1  这就是后戳的特点,    那么还剩下*号运算符了 所以(*p)就是数组的第一个元素, 因为p就是数组的首地址,(一个指向数组地址的指针变量+1就意味着地址偏移它本身指向的类型字节数的单元个数 例如这里是int类型那么+1就是来到下一个内存单元))而且此时p的值本身还没有发生变化因为它刚刚是被后戳++运算符给运算了,还没有来得及+1 要等P下次出现的语句中这个++才生效,    所以

  • a[0] = 2;

    明白了吗

    那么

  • a[1] = *p++; 此时重复了上面的计算过程 不过你应该知道此时的a括号后面的[]括号里面的i应该是1了对吧?同时p的值也作用了后戳的运算对不对?  下面的都是这样子了。一次类推,说的可能有点繁琐。

    其实,你没有具体的内存概念。

给你说的再细致点:就是 p+1 你知道意味着什么吗?int*p=a 你又知道是什么意思吗?

这种看起来和数学中的小学题目一样的表达式其实不能光用数学上的一种思维方式去思考

你要知道每个语句背后的内存中发生的事情。在我看来p = a 就是说p这个变量得到了

a这个数组的首地址。 那么这个首地址在哪? 你都要知道, 不要只是概念的去理解,应该具体到物理硬件上, 因为计算机是个物理设备,它是具体的在表现数据。


根据这些其实整个a数组的值还是自己原来的数值,那么最后输出a[2]就是6

a[0]就是2  

a[1]就是4

a[2]就是5

a[3]就是2

a[4]就是8

好了扯远了。希望对你有帮助! ^_^

回答2:

运行后会输出6
因为这相当于
for(i=0;i<4;i++)
a[i]=a[i];

回答3:

6,6,10,10

回答4:

45224