悬挂 else · else 永远配最近的未匹配 if
缩进会骗人,编译器不看缩进 —— 想让 else 归外层,必须用花括号 {}
① 一段有歧义的代码
if
(a)
外层 if
if
(b) s1;
内层 if
else
s2;
这个 else 配谁?
缩进让人以为
else
对齐
if (a)
但编译器只看语法,不看空格缩进
编译器配对
你以为(被缩进误导)
else 配
if (a)
→ a 为假就走 s2
实际(配对规则)
else 配
if (b)
最近的未匹配 if
→ 只有 a 真 且 b 假,才走 s2
以为
实际
② 想让 else 真正归外层 if(a)?加花括号 {}
if
(a)
{
if
(b) s1;
}
else
s2;
← 现在 else 配 if(a)
花括号 {} 关闭了内层 if
内层
if (b)
被 {} 包住、已闭合,
不再是「未匹配的 if」。
于是
else
只能与外层
if (a)
配对。
原则:缩进给人看,花括号给编译器看。
▶ 重播