华为C语言面试题求解?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为C语言面试题求解?相关的知识,希望对你有一定的参考价值。

int arr[] = 1,2,3,4,5,6,7,8;
int *p=arr;
*(p++)+=123; //?*p+=123; p++; ??
printf("%d,%d\n", *p,*(++p)); // *(++p)??
求每步骤详细解析。

第一行,定义数组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,写的时候就忘了,哈哈

参考技术A 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指向的地址相同。这个你得去研究研究编译器的输出原理了。

参考技术B 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 很清楚,知道了很感谢

参考技术C 华为面试题这么简单???!!!当年我怎么遇到的怎么那么难???!!!追问

那您能提供些题目供讨论吗? 学习学习下,我是网上看到的这个

追答

我不是面试C的。

参考技术D printf()参数的计算从右向左的 第5个回答  2011-11-22 首先括号里面先解 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 是右运算的吧。
不过按理说,华为的面试题不会出现这种情况。
不懂了,搞懂了跟我说下

曾经的华为C面试题,一点就通

 学习编程可以锻炼你的思维,帮助你更好地思考,创建一种我认为在各领域都非常有用的思维方式。
 
比尔盖茨
 

 曾经的华为C面试题,一点就通


 【问题区】

 

    有两个变量x和y, x=10; y = 20;  请使用C语言代码实现两个变量的交换,要求至少使用3 种办法!

 


 【提示区】

 

        如果使用一个临时变量,来交换两个x和y的值,这是初学者都会的事情,如果不用临时变量,我们有没有办法实现呢?

 

大家还记得初中代数中的公式吗?

       x + y = z  ; 那么 x= z - y   或是 y = z - x ;

       x *  y = z  ; 那么 x = z / y  或是 y = z / x;

 

 上面这个公式说明: 如果我们知道两个数,以及两个数经过某种运算得到的结果,我们就可以通过三者中的任意两者得到第三者的结果!

 


【C代码实现区】

 

#include <stdio.h>

 

int main(void){

  int x = 10;

  int y = 20;

 

  //第一种方法  临时变量交换

  int z = 0;

  z = x;

  x = y;

  y = z;

 

  //第二种方法  加法

  x = x + y;     //执行后 x=30,y=20

  y = x - y;      //执行后 x=30,y=10

  x = x - y;      //执行后 x=20,y=10

 

  //第三种方法  乘法

  x = x * y;      //执行后 x=200,y=20

  y = x / y;       //执行后 x=200,y=10

  x = x / y;       //执行后 x=20,y=10

 

  //第四种方法 异或运算

  x = x ^ y;

  y = x ^ y;

  x = x ^ y;

 

  printf("x=%d, y=%d ", x, y);

  return 0;

}

 


 【视频讲解】

 地址:https://v.qq.com/x/page/v08145k1qdr.html

 

以上是关于华为C语言面试题求解?的主要内容,如果未能解决你的问题,请参考以下文章

华为面试C语言真题

曾经的华为C面试题,一点就通

两道c语言题目求解

java笔试面试题及答案(华为篇)

嵌入式开发—C语言面试题

经典C语言面试算法题