面试题答案
一键面试#import <Foundation/Foundation.h>
// 定义一个函数,根据不同参数类型进行不同操作
void performOperationsWithArguments(NSInteger count, ...) {
va_list args;
va_start(args, count); // 初始化可变参数列表
NSInteger intSum = 0;
NSInteger intCount = 0;
double floatSum = 0;
NSMutableString *stringResult = [NSMutableString string];
for (NSInteger i = 0; i < count; i++) {
const char *type = va_arg(args, const char *); // 获取参数类型
if (strcmp(type, @encode(int)) == 0) {
int number = va_arg(args, int);
intSum += number;
intCount++;
} else if (strcmp(type, @encode(double)) == 0) {
double number = va_arg(args, double);
floatSum += number * number;
} else if (strcmp(type, @encode(NSString *)) == 0) {
NSString *str = va_arg(args, NSString *);
[stringResult appendString:str];
}
}
va_end(args); // 清理可变参数列表
if (intCount > 0) {
NSLog(@"整数平均值: %f", (double)intSum / intCount);
}
NSLog(@"浮点数平方和: %f", floatSum);
NSLog(@"字符串连接结果: %@", stringResult);
}
你可以这样调用这个函数:
int main(int argc, const char * argv[]) {
@autoreleasepool {
performOperationsWithArguments(4,
@encode(int), 1,
@encode(double), 2.5,
@encode(NSString *), @"Hello",
@encode(int), 3);
}
return 0;
}
代码说明:
performOperationsWithArguments
函数:- 接受一个
NSInteger
类型的count
参数,表示传入参数的个数。 - 使用
va_list
、va_start
、va_arg
和va_end
来处理可变参数。 - 遍历每个参数,根据参数类型进行不同操作:
- 对于整数,累加并统计个数,最后计算平均值。
- 对于浮点数,计算平方和。
- 对于字符串,进行连接。
- 接受一个
main
函数:- 调用
performOperationsWithArguments
函数,传入不同类型的参数,并给出参数类型编码。
- 调用
- 注意事项:
- 每次调用
va_arg
时,确保传入正确的类型,否则可能导致未定义行为。 - 使用完可变参数列表后,务必调用
va_end
,以避免内存泄漏。这优化了va_list
的使用,确保内存正确管理并且提高了代码效率。
- 每次调用