1. 为什么运算符是C语言的基石?
刚接触C语言时,很多人会觉得运算符不就是加减乘除吗?但真正开始写代码后,你会发现一个简单的i++就能让人抓狂。我在带新人时最常听到的抱怨就是:"为什么这段代码的输出和我想的不一样?"
运算符之所以重要,是因为它直接决定了程序的行为逻辑。比如在LeetCode第461题"汉明距离"中,用错一个位运算符就会导致完全错误的结果。更可怕的是,这类错误往往不会直接报错,而是悄无声息地给出错误答案,等你发现时可能已经调试了半小时。
我曾见过一个经典案例:有人想用a = a++来实现自增,结果程序陷入死循环。这是因为他不理解后缀自增的"先用后加"特性。这类问题在笔试面试中经常出现,也是区分新手和老手的重要标志。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算术运算符:你以为的简单其实不简单
2.1 基础四则运算的陷阱
看起来最人畜无害的除法运算符/,在实际使用中却暗藏杀机。当两个整数相除时,C语言会直接截断小数部分。比如:
c复制int a = 5 / 2; // 结果是2,不是2.5
float b = 5 / 2; // 仍然是2.0,因为先进行整数除法
正确的做法是至少让一个操作数为浮点数:
c复制float c = 5.0 / 2; // 这才是2.5
求余运算符%也有类似问题,它只能用于整数运算。很多人会错误地用在浮点数上:
c复制double d = 5.3 % 2; // 编译错误!
2.2 自增自减的"人格分裂"
++和--运算符可能是C语言中最让人困惑的设计。我在LeetCode第29题"两数相除"中就踩过坑:
c复制int sign = 1;
// 错误写法
sign = sign++;
// 正确写法
sign++;
前缀和后缀的区别在于:
++i:先自增再使用("急性子")i++:先使用再自增("慢性子")
更复杂的是在表达式中混合使用时:
c复制int i = 1;
int j = (i++) + (++i); // 未定义行为!不同编译器结果可能不同
3. 位运算:算法优化的秘密武器
3.1 汉明距离的优雅解法
位运算在算法题中经常大显身手。以LeetCode 461为例,
