关于C++数组去重代码的两处技术细节疑问
关于C++数组去重代码的两个疑问解答
疑问1:为何函数参数无需传入数组容量?是否因数组元素已确定,长度可被自动识别?
普通C风格数组作为函数参数时,会退化为指针——比如你写void deduplicate(int numbers[]),编译器实际会把它当成void deduplicate(int* numbers)处理,这时候编译器根本不知道原数组的长度,不可能自动识别。
讲师的代码大概率用了模板函数结合数组引用的写法,比如:
template <size_t N> void deduplicate(int (&numbers)[N]) { // 这里N就是数组的容量,编译器会自动推导 }
这种写法里,数组是以引用的形式传递的,编译器能通过模板参数推导拿到数组的实际大小N,所以不需要手动传入容量。如果不是这种写法,那要么是代码里用了其他标记(比如数组末尾有特殊值),要么就是暗藏bug——毕竟光靠指针根本没法确定数组长度。
疑问2:当unique_counter初始化为0时,首次执行unique_data[unique_counter++] = numbers[0]时,是否先以0为下标赋值再进行自增操作?
对,完全是你想的这样。C里的**后置自增运算符()**规则是:先返回变量的当前值,再对变量进行自增操作。
举个最简单的例子验证:
int x = 0; int y = x++; // 此时y的值是0,x的值是1
放到你的代码里就是:先用unique_counter的当前值0作为下标给unique_data赋值,赋值完成后,unique_counter才会自增为1。
内容的提问来源于stack exchange,提问作者Petr Máša
相关产品推荐
相关产品推荐

