2

我只是想知道这样做会更好:

if((fd = open(filename, O_RDWR)) == -1)
{
fprintf(stderr, "open [ %s ]\n", strerror(errno));

return 1;
}

或这个

fd = open(filename, O_RDWR);
if(fd == -1)
{
    fprintf(stderr, "open [ %s ]\n", strerror(errno));

    return 1;
}

非常感谢您的任何建议,

4

10 回答 10

12

咳咳,分了吧 通过将所有内容混合在一条线上,您可以获得什么?让我们比较和对比:

单线:

  • 好处:
  • 缺点:难以阅读,容易出错。(考虑您的第一次修订。)

多行:

  • 优点:易于阅读,不易出错。
  • 缺点:

我认为这很清楚。:)


“有时把它放在一行更有意义,例如:while ((c=getchar())!=EOF)

这很好,但这里不是这种情况。有时将其拆分更有意义,但总的来说,不要拆分。


“它节省了更多的垂直空间”

如果一行代码扼杀了您查看函数的能力,您需要 1) 购买分辨率高于 640x480 的显示器,以及 2) 编写更小的函数。

真的,我从来没有理解过任何东西的论点,函数应该很容易适应任何屏幕,不管一行的差异。


“多行使它看起来很复杂”

不是真的,把它放在一条线上可以说更难阅读,看起来也更复杂。把事情分开可以更简单地一次处理一个位,不应该假设两行使其复杂两倍。

于 2010-04-29T02:56:04.520 回答
6

有几个人支持第二种。我不同意他们的看法。虽然(显然)最初在第一个中与=vs.有一个小问题==,但我认为这是一个小问题。

一个更大的问题是人们(尤其是如果他们很匆忙)跳过错误检查太常见了——if (whatever == -1)完全忽略了错误检查,通常是基于他们正在处理的东西是快速的、一次性的理论代码和检查错误并不是真正需要的。这是一个非常坏的习惯;我几乎可以保证每个阅读这篇文章的人都看过像这样跳过错误检查的真实代码,即使它真的,真的应该有它。

在这样的代码中,尝试打开文件并检查是否存在错误应该是密不可分的。将两者放在同一个语句中反映了正确的意图。将两者分开是完全错误的——在任何时候,无论出于何种原因,都不应该以任何方式将它们分开。这应该被编码为一个单一的操作,因为它应该一个单一的操作。它应该始终被认为和编码为一个单一的操作。

在我看来,这样做的借口是相当薄弱的。现实情况是,任何使用 C 语言的人都需要能够阅读结合了赋值和条件测试的代码。举一个明显的例子,一个循环像while ((ch=getchar()) != EOF)几乎一样需要编写为一个组合的赋值和测试——尝试EOF单独测试通常会导致代码不能正常工作,如果你让它正常工作,代码要复杂得多。

同样,对于-vs.的问题==。由于我一开始没有看到缺陷,我不确定将两者分开多少可以避免问题,但我的直接猜测是它可能几乎没有任何区别。当应该是一个条件只包含一个赋值时会警告你的编译器已经存在了很多年(例如 gcc)。在大多数情况下,症状几乎是立即显而易见的——简而言之,你在这篇文章的一部分中犯了一个特定的错字而不是另一部分的事实并不能证明(甚至诚实地表明)关于亲属的任何事情两人的难处。

基于这种证据,我显然认为“不”比“立即”更难输入,因为我只是在没有问题的情况下输入“立即”,但之前必须更正“不”(两次,不少于)它就在上一句中出现了。我很确定如果我们按错误输入的频率来计算,“the”是英语中最难的单词。

于 2010-04-29T03:38:02.653 回答
3

也许括号使排序明显?

if((fd = open(filename, O_RDWR)) == -1)
于 2010-04-29T02:56:46.133 回答
3

在这个例子中,我将加入合唱,说第二种方法更好。

更棘手的情况是当它处于循环中时,例如:

while ((c=getchar())!=-1)
{
  ... do something ...
}

相对

while (true)
{
  c=getchar();
  if (c==-1)
    break;
  ... do something ...
}

在这种情况下,我更喜欢在一行上做,因为这样它就可以清楚控制循环的是什么,我认为这会覆盖分配和测试的复杂组合的缺点。

于 2010-04-29T03:46:58.300 回答
2

它是一种风格——你不是在问优先权(不是总统)。

许多人会争辩说后一个例子更清楚。

于 2010-04-29T02:55:56.350 回答
2

除了标准习语——那些很常见以至于每个人都会立即得到你想要做的事情的习语——我会避免在有条件的情况下做作业。首先,它更难阅读。其次,您可以通过在条件检查中使用错误的赋值运算符来让自己保持开放(至少在将零解释为假,将非零解释为真的弱类型语言中)来创建错误。

于 2010-04-29T02:56:52.687 回答
2

为了可读性,第二个更好,但我知道我经常做第一个。运算符将=优先,特别是因为您将其放在引号中,从而允许运算符返回并比较分配的值==

于 2010-04-29T02:57:13.620 回答
1

这是风格问题,是主观的。他们做同样的事情。我更喜欢后者,因为我发现它更容易阅读,并且更容易在调试器中设置断点/检查变量。

于 2010-04-29T02:56:17.117 回答
0
(-1 == __whatever__) 

尽量减少错字

于 2010-04-29T02:57:17.853 回答
0

当您编写输入循环时,第一种情况是非常正常的,因为另一种方法是必须编写两次输入命令——一次在循环之前,一次在循环结束时。

while ( (ch=getchar()) != -1){
  //do something with it
}

我认为第二种方式对于 if 语句来说更正常,你没有同样的担忧。

于 2010-04-29T04:01:19.247 回答