**
1.请定义一个宏,比较两个数的大小,不能使用大于、小于、if语句。
**
#define MAX(A,B) (((A)-(B)) >> 31 ? (B) : (A)) //注意三目运算符的原理。
说明:利用变量为负数时最高位为负数的原理,实现了MAX宏。
注意:不支持浮点型。
例如:
unsigned char a,y;
x = 89;
y = 56;
(1)printf("val = %d\n",(y-x) >> 31); //结果为:-1 : MAX(Y,X)
(2)printf("val = %d\n",((y-x) >> 31 ? x : y); //结果为:x :(1)值为0,则(2)结果为y; (1)值为-1,则(2)结果为x。
2.在c++中,如何输出源文件的标题和目前执行行的行数
#include <iostream>
using namespace std; //定义空间
int main(void)
{
int line = __LINE__; //行号
char *file = __FILE__; //绝对路劲
cout <<"file name is "<< (file) <<",line is "<< line <<endl;
return 0;
}
3.请说出const与#define 相比,有何优点?
首先说说const的作用:
将变量定义成只读属性,修饰函数参数,修饰函数返回值 三个作用。
一:只读属性:被const修饰的变量受到强制保护。
二:修饰函数参数:防止被函数意外的变动。
三:修饰函数参数,修饰函数返回值:提高程序的健壮性
比较:
(1)const 变量是由数据类型,而宏常量是没有数据类型的;所以编译器可以对前者进行类型安全检查,而后者只进行字符替换,没有类型安全检查,所以可能会产生意料不到的错误。
(2)有些集成化的调式工具可以对const变量进行调试,但是不能对宏常量进行调试。
4.简述数组与指针的区别?
答:数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。
(1)修改内容的差异
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 注意p 指向常量字符串
p[0] = ‘X’; // 编译器不能发现该错误,运行时错误
(2)用运算符sizeof 可以计算出数组的容量(字节数)。
sizeof(p),p 为指针得到的是一个 指针变量的字节数,而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
计算数组和指针的内存容量
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是100 字节
}