ava*_*kar 19 c c++ coding-style
此问题的灵感来自此问题,其中包含以下代码段.
int s;
if((s = foo()) == ERROR)
print_error();
Run Code Online (Sandbox Code Playgroud)
我发现这种风格难以阅读并且容易出错(正如原始问题所示 - 它是由于在作业周围缺少括号而引起的).我会写下面的内容,实际上字符更短.
int s = foo();
if(s == ERROR)
print_error();
Run Code Online (Sandbox Code Playgroud)
这不是我第一次看到这个成语,我猜这里经常使用的原因(也许是历史的).这些原因是什么?
mdm*_*dma 15
我认为这是出于歇斯底里的原因,早期的编译器在优化方面并不那么聪明.通过将它作为单个表达式放在一行上,它为编译器提供了一个提示,即可以测试从foo()获取的相同值,而不是专门从中加载值s
.
我更喜欢你的第二个例子的清晰度,稍后完成作业和测试.现代编译器可以将其优化为寄存器,避免内存存储中不必要的负载.
Alo*_*hal 13
在编写循环时,有时需要使用第一种形式,如K&R中这个着名的例子:
int c;
while ((c = getchar()) != EOF) {
/* stuff */
}
Run Code Online (Sandbox Code Playgroud)
在没有重复的情况下,没有优雅的"第二种形式"写作方式:
int c = getchar();
while (c != EOF) {
/* stuff */
c = getchar();
}
Run Code Online (Sandbox Code Playgroud)
要么:
int c;
for (c = getchar(); c != EOF; c = getchar()) {
/* stuff */
}
Run Code Online (Sandbox Code Playgroud)
现在c
重复赋值,代码更容易出错,因为必须保持两个语句同步.
因此,必须能够学会轻松地阅读和编写第一个表格.鉴于此,在if
条件中使用相同的形式似乎也是合乎逻辑的.
我倾向于使用第一种形式,因为我觉得它很容易阅读 - 正如别人所说,它更接近于函数调用和返回值测试.
我尽可能地有意识地将两者结合起来.IMO的"惩罚"规模不足以克服清晰度的优势.
清晰度的优点来自于一个事实:对于这样的函数,你应该总是考虑调用函数并将返回值测试为单个动作,不能分成两部分("原子",如果你愿意的话).如果不立即测试其返回值,就不应该调用这样的函数.
将两者分开(根本)会导致您有时更不可能完全跳过检查返回值.其他时候,你会不小心在调用和返回值测试之间插入一些代码,这些代码实际上取决于成功的函数.如果你总是将它全部组合成一个语句,它(几乎)消除了落入这些陷阱的任何可能性.