首 页 行业资讯 新车 试驾评测 养车用车 车型库

华为C语言面试题求解?

发布网友 发布时间:2022-04-20 04:52

我来回答

6个回答

热心网友 时间:2022-07-13 03:59

第一行,定义数组arr,元素共八个
第二行,定义指针p指向arr数组
此时的*p还是等于arr数组的第0个元素,也就是1
第三行,p++里的++是最后才运算,所以先执行*p+=123,也就是arr的第0个元素被赋值为123
此时arr变成{123,2,3,4,5,6,7,8} ,然后是p++,此时*p已经是等于arr的第1个元素了,也就是2
第四行,在执行printf时,括号里的参数是从右往左的顺序进行读取的,也就是说先执行 *(++p),也就是p先加一再指针,指向的是arr第2个元素3,然后在执行*p,还是3
最后显示的内容就是
3,3
press any key to continue追问您回答的堪称完美,非常感谢,就是一点小遗憾 *p+=123 应该*p=124吧
基本都解释清楚了,谢谢了

追答我自己想的时候还知道是124,写的时候就忘了,哈哈

热心网友 时间:2022-07-13 04:00

int arr[] = {1,2,3,4,5,6,7,8};
int *p=arr; 此时p指针指向数组首地址 即值为1的地方
*(p++)+=123; //?*p+=123; p++; ??
上面代码++在后,先获取*p的值为1,与123相加则此时arr数组第一位值arr[0]变为124,然后将p指针向后移动一位,即指向arr数组第二位 值为2的地方 此时*p 为2
printf("%d,%d\n", *p,*(++p)); // *(++p)??
此时输出*p为2 *(++p) ++在前先移动指针到第三位,此时值为3追问解释的很清楚。非常感谢。 我解析下您看对不
1. *(p++)+=123 就是
*p+ =123;
p++; //逻辑是您上面所说
2. *(++P) 将当前地址后移一位再取值
如果正确的话。
为什么结果会是3.3. 很奇怪

追答这个貌似是编译器的不同,会导致结果不同,printf("%d,%d\n", *p,*(++p));
这一行代码 应该是先计算后,就是在*(++p) 运算后,再将两个输出的,就是说两个在输出时p都指向了第三个,两个输出时p指向的地址相同。这个你得去研究研究编译器的输出原理了。

热心网友 时间:2022-07-13 04:00

int *ptr=arr;
//执行这句后ptr指向arr的首元素,就是1
*(ptr++)+=123;
//先是ptr++,ptr指向arr的第2个元素,再将这个元素值加上123,第二个元素变成130

printf("%d,%d",*ptr,*(++ptr));
//注意在常见的编译器中,函数的参数是从右往左计算的,因此是先计算*(++ptr),ptr指向了arr的第三个元素3,取*后当然是3,再是*ptr,还是3。追问您头端解释的很茫然。。。
后面解释了结果是3.3 很清楚,知道了很感谢

热心网友 时间:2022-07-13 04:01

华为面试题这么简单???!!!当年我怎么遇到的怎么那么难???!!!追问那您能提供些题目供讨论吗? 学习学习下,我是网上看到的这个

追答我不是面试C的。

热心网友 时间:2022-07-13 04:02

printf()参数的计算从右向左的

热心网友 时间:2022-07-13 04:02

首先括号里面先解 p++,先执行再加1,*(p++)+=123,其实就是arr[0]+=123,p=p+1;
printf("%d,%d\n", *p,*(++p)); 此时*p=arr[1]=2, *(++p)=arr[2]=3
输出
2,3

没有编译,不知道我的回答对不对会,希望你能编译了告诉我下,我这边没有编译器。追问结果是3,3.所以不懂啊

追答可能与编译器或运行环境有关系吧,可能printf 是右运算的吧。
不过按理说,华为的面试题不会出现这种情况。
不懂了,搞懂了跟我说下

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com