C语言,为什么第三题答案是3?我觉得是12,请给过程

2025-01-01 05:23:35
推荐回答(3个)
回答1:

(*p++)++**++p 相当于 ((*p++)++)*(*++p) ,先看 *p++,先取p(因为++是后缀)与 * 结合,得1(也就是a[0]的值了),之后p移动一位指向下一个数(指向了a[1]),接着是括号后面的++,使得a[0]的值加1变为2,但此时不影响*p++的结果,右边括号内是p先移动指向a[2](因为此前p已经指向了a[1]),再取a[2]的值,也就是3了,最后左边的1 * 右边的3,等于3。

回答2:

答案确实是3.过程如下:
(*p++) 使得,p向后移动,指向a[1],并返回原来p的值(指向a[0]),在此表达式中相当于a[0]
(*p++)++执行,相当于a[0]++,使得a[0]的值为2,并返回1
之后,遇到了第一个*,所以转到计算*++p,之前p指向a[1],所以现在,先自加1,指向a[2],解引用后为3,所以,整个表达式值为1*3=3
望采纳!!!

回答3:

这种运算在不同的系统上会有不同的结果,不建议深究这种无意义的脑残题:


(*p++)返回*p,并使p指针前移一位指向a[1],然后由(*p++)返回的*p(此时的p指针依然指向a[0])参与后缀++的运算,即(*p)++,这个(*p)++会先返回a[0]的值1参与乘法运算,再将a[0]的值增1;由于 前面的再次后缀++运算已经使p指向了a[1],所以后面的++p会先使p前移一位指向a[2],会返回a[2]的地址,再配合*的作用提取到了a[2]的值3,所以乘法运算就是a[0]*a[2],注意这里的a[0]是一开始的1,不是增值后的2。


//强烈鄙视出这种脑残题的贱人!!