文章目录
- 面试题1--->编程风格问题
- 面试题2--->不用if等判断语句找出两个数中间较大的那个
- 面试题3--->写一个交换两个数据的宏
- 面试题4--->写一个宏返回两个数据中较小的那个
- 面试题5--->char *和char []的区别
- 面试题6--->临界区,互斥量,信号量的区别
- 面试题7--->网络中常见的ping命令属于什么协议?
面试题1—>编程风格问题
// 方式1
if ('A' == a){
a++
}
// 方式2
if (a == 'A'){
a++
}
第一种方式比较好一些,因为有时候会把“==”误写成“=”,编译器不允许对常量赋值,所以会在编译的时候就报告错误。
// 方式1
for (int i = 1; i < vec.size(); ++i)
// 方式2
int sz = vec.size();
for (int i = 1; i < sz; ++i)
第二种方式比较好一些,不需要重复计算vec.size()。
面试题2—>不用if等判断语句找出两个数中间较大的那个
int max = ( (a + b) + abs(a-b) ) / 2;
面试题3—>写一个交换两个数据的宏
#define swap(a,b) \
{
char tmpbuf[10];
memcpy(tmpbuf, &a, sizeof(a));
memcpy(&a, &b, sizeof(b));
memcpy(&b, tmpbuf, sizeof(tmpbuf));
}
面试题4—>写一个宏返回两个数据中较小的那个
#define MIN(a,b) ( (a) <= (b) ? (a) : (b) )
面试题5—>char *和char []的区别
#include<iostream>
using namespace std;
int main()
{
char str1[] = "Hello world";
char str2[] = "Hello world"; // 这里开辟了两处空间,所以不相等
if (str1 != str2)
cout << "str1和str2不相等" << endl;
char *p1 = "Hello world";
char *p2 = "Hello world"; // 这里指向相同的字符串。该字符串只用了一个地址
if (p1 == p2)
cout << "p1和p2相等" << endl;
return 0;
}
char str[]这里单独的str表示的是一个char类型的数组指针,该指针所指向的数组内容是保存在栈上面的,是可以修改的。而char *str是一个字符串指针,这个指针指向的是字符串第一个字符的地址,而这个指针存在栈上,但是字符串的内容并不在栈里面,而在字符常量区域里面储存。
面试题6—>临界区,互斥量,信号量的区别
- 临界区:同一个进程内的线程实现互斥,但无法实现同步,因为其具有“线程所有权”。
- 互斥量:可以跨进程实现互斥。
- 信号量:用来实现同步也可以用来实现互斥,可以跨进程。
面试题7—>网络中常见的ping命令属于什么协议?
ICMP是“Internet Control Message Ptotocol”(Internet控制消息协议)的缩写。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息尽管并不传输用户数据,可是对于用户数据的传递起着关键的数据。
在网络中常常会使用到ICMP协议。比如用于检查网络通不通的ping命令,这个ping的过程实际上就是ICMP协议工作的过程。还有跟踪路由的trancert命令也是基于ICMP协议的。
ping.exe的原理:向指定的IP地址发送一定长度的数据包。依照约定,若指定IP地址存在的话,会返回相同大小的数据包。当然,若在特定时间内没有返回,就是“超时”,会被觉得指定的IP地址不存在。因为ping使用的是ICMP协议,有些防火墙软件会屏蔽ICMP协议,所以有时候ping的结果仅仅能作为參考,ping不通并不一定说明对方IP不存在。