if语句核心是三件事:括号书写正确、避免赋值误写为比较、注意变量作用域;条件表达式需为bool型,C++支持整数、指针等隐式转换;浮点比较应避免直接等于,改用误差判断。

if 语句本身没有“用法详解”的必要——它就三件事:写对括号、别把 == 写成 =、注意作用域里变量的生命周期。
if 后面的条件表达式必须是 bool 类型,但 C++ 会悄悄帮你转
C++ 允许用整数、指针甚至自定义类型做条件,只要它们能隐式转成 bool。比如 if (ptr) 看似在判断指针是否为空,实际是调用 operator bool() 或者靠指针到 bool 的内置转换。
- 整数非零即真:
if (5)永远成立,if (0)永远不进 - 浮点数慎用:
if (x == 0.1)很可能失败,该用abs(x - 0.1) - 字符串不能直接判空:
if (str)不报错但行为未定义(除非str是std::string且有explicit operator bool(),C++17 起才有)
else if 和 else 容易漏掉大括号,引发逻辑错位
没加大括号时,else 总是绑定到离它最近的、未配对的 if。缩进骗不了编译器。
if (x > 0)
if (y > 0)
std::cout << "both positive";
else
std::cout << "x <= 0"; // 这个 else 实际属于 inner if!- 永远给
if/else if/else块加{},哪怕只有一行 -
else if不是关键字,是else { if (...) }的换行写法,所以嵌套层级要靠大括号显式控制 - 用 clang-format 或 IDE 自动格式化时,确认它没把单行
if的{}给删了
switch 和 if 的性能差异在现代编译器下基本可以忽略
很多人以为 switch 一定比一长串 if-else if 快,其实 GCC/Clang 在优化开启(-O2)后,对连续整数 case 会生成跳转表,对稀疏或非整数情况可能照样编译成二叉树比较——跟 if 链差不多。
立即学习“C++免费学习笔记(深入)”;
- 优先选
if:条件复杂(比如带函数调用、范围判断x >= 10 && x ) - 优先选
switch:纯整型/枚举等值匹配,且 case 数量多、值较密集 -
default分支别漏,否则未覆盖的 enum 值可能静默跳过(开启-Wswitch-enum可警告)
最常被忽略的是 if 里的变量声明位置:在条件中声明的变量(if (int x = get_val(); x > 0))只在该分支作用域内有效,出作用域就析构——这点在 RAII 资源管理时特别关键,也容易误以为变量还活着。










