C++面试题 (10-20)

"本文介绍了C/C++编程中的一些常见技巧,如无条件找到较大值、不使用额外变量交换两数之值,以及理解extern"C"在C++中调用C函数的作用。同时讲解了头文件的防止重复引用机制、不同#include方式的区别,以及预处理宏MIN的实现。此外,还探讨了const关键字的多种用途。"
摘要由CSDN通过智能技术生成

11、有两个变量a和b不用if,:?,switch或者其他判断语句,找出两个数中较大的。

答案

int max = ((a+b)+abs(a-b))/2;
int c = a -b;
char *strs[2] = {"a大","b大"};
c = unsigned(c)>>{sizeof(int)*8-1);
cout<<strs[c]<<endl;

解析
unsigned int 范围为 0 —— 2 32 2^{32} 232 -1
最大值用二进制即为 1111 1111 … 1111 (共有32个1)
左移31位后为 0000 000 … 0001 (共31个0 )
∵ 当c的值小于 2 31 2^{31} 231时左移31位为0
∵ 当c为负数时,转为整数后 值大于等于 2 31 2^{31} 231
又∵int的最大值为 2 31 − 1 2^{31}-1 2311
∴ 当c>0 时右移31位后值为0 , 当c<0时转为无符号后并右移31位后值为1;

12、交换ab的值,并且不使用任何中间变量

a = a +b;
b = a-b;
a = a-b;

缺点:如果ab是比较大的两个数会超界;

a = a^b;
b = a^b;
a = a^b;

没有超界问题。
解析
异或有个运算法则

自反:a ⊕ b ⊕ a = b.

还是不知道就自己取两个值试一下就知道

13.在c++程序中调用被c编译器编译过后的函数,为什么要加extern “C”?

解析
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字跟C语言的不同。假设某个函数原型为:void foo(int x,int y).该函数被C编译器编译后在库中的名字是__foo,而C++编译则会产生像_foo_int_int之类的名字。
C++提供了C连接交换指定符号extern "C"解决名字匹配问题。

14.头文件中的ifndef/define/endif是干什么用的?

解析
防止头文件被重复引用。

15、#include <filename.h>和 #include "filename.h"有什么区别?

解析
<>:编译器从标准库路径开始搜索filename.h (只能搜索标准库)
“”:编译器从用户的工作路径开始搜索filename.h(如果没有搜索到再到标准库搜索)

16、如何判断一段程序是由C编译程序还是C++编译程序编译?

解析
C++编译时定义了cplusplus
C编译时定义了__STDC_

由于c语言是没有重载函数的概念的,所以c编译器编译的程序里,所有函数只有函数名对应的入口。
而由于c++语言有重载函数的概念,如果只有函数名对应的入口,则会出现混淆,所以c++编译器编译的程序,应该是函数名+参数类型列表对应到入口。

17、下面代码的输出结果是?

#define SQR(X) (X*X)
main()
{
int a, b= 3;
a = SQR(b+2);
printf("\n%d",a);
}
答案
11
解析
define 的本质就是替换
所有 a = b + 2 * b + 2 = 3 + 2 * 3 + 2 = 11;

18、用预处理指令#define声明一个常数,用以表示一年中有多少秒(忽略闰年问题)

解析
#define语法的基本知识:不能以分号结束,括号的使用。
表达式将会使16位机器溢出,因此要用到长整型符号L,告诉编译这个常数是长整型数
UL(无符号长整型)
#define SECONDS_PER_YEAR我是空格(60 * 60 * 24 * 365UL)

19、写一个“标准”宏MIN,这个宏输入两个参数并且返回较小的一个。

解析
注意后面的A 和 B 有括号
#define MIN(A,B) ((A)<=(B))?(A):(B)

20.const什么用途,请至少说出两种。

答案
(1)可以定义const常量(2)cosnt可以修饰函数的参数和返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,提高程序的健壮性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值