面试题答案
一键面试- 参数类型检查
- define宏定义:
- 宏定义不进行参数类型检查。它只是简单的文本替换。例如:
- define宏定义:
#define SQUARE(x) x * x
int a = 5;
float b = 2.5f;
int result1 = SQUARE(a);
float result2 = SQUARE(b);
这里不管a
是int
类型,b
是float
类型,宏定义都会按照文本替换规则进行替换,不会对参数类型进行检查。
- 函数:
- 函数在定义时会指定参数类型,调用时会进行严格的类型检查。例如:
int square(int num) {
return num * num;
}
int a = 5;
// float b = 2.5f; // 如果这样调用square(b),编译会报错,因为类型不匹配
int result = square(a);
函数square
要求参数为int
类型,如果传递其他不匹配的类型,编译时会报错。
2. 参数求值顺序
- define宏定义:
- 宏定义在替换时,参数的求值顺序取决于宏调用上下文,可能导致一些意想不到的结果。例如:
#define MAX(a, b) ((a) > (b)? (a) : (b))
int x = 5;
int y = 10;
int result = MAX(++x, y);
这里可能因为++x
在宏替换时的求值顺序问题,导致先对x
进行自增操作,结果可能不是预期的简单比较5
和10
的大小。
- 函数:
- 函数参数的求值顺序在C++标准中是未指定的,但在具体编译器实现上通常是从右向左或从左向右的固定顺序。例如:
int max(int a, int b) {
return a > b? a : b;
}
int x = 5;
int y = 10;
int result = max(++x, y);
虽然参数求值顺序未指定,但它不会像宏定义那样因为简单文本替换而产生与预期不符的复杂求值顺序问题。在函数中,++x
的自增操作和函数参数传递是按照编译器规定的一定顺序进行的。