从 size_t 到面试官的微笑:我的 C++ 面试历险记

面试复盘

之前面试遇到一些很好玩的事情,也学到了很多知识,积累了很多经验。

某中厂面试的虚拟表演的第三轮:

有一道题我用了经典 for 循环,大概这样:

vector<int> arr = {0, 1, 2);
for (int i = 0; i < arr.size(); i++) {
	// xxxxxxxx
}

然后编译器报warning,说i的类型和arr.size()不匹配,当时用的CoderPad,我不记得哪个版本编译器了,面试官说TA不懂C++,但是看到warning很不爽,你给我想办法搞清楚。我很无语,这不就是类型转换,于是用了size_t替换,面试官心满意足的笑了。

还是这家公司第四轮,我自鸣得意地直接用了

for (size_t i = arr.size() - 1; i >= 0; i--) {
	// xxxxxxxx
}

然后就搞笑了,超时,循环退不出来了。我一拍脑门,size_t 是无符号类型诶,赶紧改成int,然后美滋滋。面试官一脸冷漠看完全程,说:我不会C++,也不知道你说的无符号类型是什么意思,但是现在结果对了,这很不错。

哈?

总结分析

精华知识点提炼

类型匹配问题

  • 在C++中,vector::size()返回的类型是size_t,通常是无符号整数类型(如unsigned intunsigned long)。

  • 使用int类型的变量isize_t类型的arr.size()进行比较时,编译器可能会发出警告,提示类型不匹配。

  • 解决方法:将i的类型改为size_t,以匹配arr.size()的返回类型。

    for (size_t i = 0; i < arr.size(); i++) {
        // xxxxxxxx
    }
    

无符号类型的陷阱

  • size_t是无符号类型,意味着它不能表示负数。

  • 当使用size_t类型的变量进行递减操作时,如果变量值为0,再减1会导致溢出,变成一个非常大的正数,从而导致循环无法退出。

  • 解决方法:在需要递减循环时,使用有符号类型(如int)来避免溢出问题。

for (int i = arr.size() - 1; i >= 0; i--) {
    // xxxxxxxx
}

面试中的沟通与理解

  • 面试官可能不熟悉特定的编程语言细节(如C++中的size_t和无符号类型),但关注的是代码的正确性和可维护性。

  • 在面试中,解释清楚问题的原因和解决方案,即使面试官不熟悉技术细节,也能展示出你的问题解决能力和沟通技巧。

总结

  • 类型匹配:在C++中,循环变量的类型应与容器大小类型匹配,避免编译器警告。

  • 无符号类型陷阱:在使用无符号类型时,注意其不能表示负数的特性,避免循环溢出问题。

  • 面试沟通:即使面试官不熟悉技术细节,清晰的解释和正确的解决方案也能赢得认可。

你可能感兴趣的:(C/C++,#,面试经验,c++,面试,C)