在 C 语言的最初版本中,允许在 if 语句中省略花括号来处理单个语句。这使得代码更为紧凑,但也导致了很多不明显的错误,特别是在扩展和修改时。其历史原因是为了节省空间以及简化语法以应对极简的情况。
问题出现在开发人员忘记了没有花括号的 if 仅控制其后第一个表达式:所有后续语句总是会被执行,即使在视觉上,这似乎并不明显。这种风格导致了隐藏的缺陷,在阅读代码时难以发现,而由于忘记缩进或添加新行而引发的错误。
解决方案是始终使用花括号,即使只有一个语句。这会提高代码的可读性和安全性。
代码示例:
// 不好: if (x > 0) do_something(); do_other(); // 总是执行 // 更好: if (x > 0) { do_something(); do_other(); }
关键特点:
缩进(制表符/空格)是否影响 if 的作用域?
不,在 C 语言中,作用域仅由花括号定义,而与缩进无关。
如下代码的行为是什么?
if (a > 0) fun1(); fun2();
fun1() 仅在 a > 0 时调用。fun2() 始终会被调用,无论条件如何。
如果在添加新行时忘记添加花括号,后果会如何?
此代码可能会改变行为并导致错误,这在视觉上很难发现,因为缩进无法防止编译错误。
开发人员在单行 if 中添加第二个语句时忘记添加花括号。
if (user) initialize(); log_access();
优点:
缺点:
开发人员即使在仅有一个语句时也始终使用花括号:
if (user) { initialize(); log_access(); }
优点:
缺点: