2010-04-29 70 views
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; 
} 

非常感谢您的任何建议,

+2

您在第二个示例中似乎有一个括号匹配问题 – 2010-04-29 02:55:47

+2

第一个选项很好,按预期工作,并且相当常见。 – meagar 2010-04-29 02:56:15

+0

@Mark - 现在修复 – ant2009 2010-04-29 02:58:01

回答

12

Yuck,把它分开。通过将所有内容混合在一行中获得什么?让我们来比较和对比:

单行:

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

多行:

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

我认为这是明显的。 :)


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

这很好,但这里是不是这样的。有分别是时不分解更合理,但一般,不要。


,当一行被杀死你看到的功能的能力“这样可以节省更多的垂直空间”

,你需要1)买与分辨率的显示器比640×480高,2)写小功能。

真的,我已经从未理解为任何参数,函数应该容易适合在任何屏幕上,无论一行差异。


“多行使它看起来复杂”

不是真的,顺手就在同一行无疑是难以阅读和更复杂的期待。将事物拆分可以简化一次处理一个数据的过程,但不应该假设两行使其复杂一倍。

+0

我认为它更具可读性并且具有多行。 – ant2009 2010-04-29 02:59:04

+0

人们经常错误地认为,少些线条以某种方式使其更好。 – Matt 2010-04-29 03:05:24

+3

我已经争辩过同样的结论,但为了扮演魔鬼的拥护者,我会说单线的优点在于它是惯用的。 C人确切地知道你在做什么并且始终这样做 – frankc 2010-04-29 03:15:42

2

它是一种风格的东西 - 你不是问优先级(不是主持人)。

很多人会认为后者的例子更清晰。

1

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

3

也许在括号使排序明显吗?

if((fd = open(filename, O_RDWR)) == -1) 
2

除了标准的成语 - 那些是很常见的,每个人都立即得到你正在尝试做的事情 - 我会避免做在有条件的分配。首先,阅读起来比较困难。其次,在条件检查中,通过使用错误的赋值运算符来创建错误(至少在弱类型语言中将零解释为false和非零)。

2

第二个为了可读性更好,但我知道我经常做第一个。优先考虑=运营商,尤其是因为您将其用引号括起来,从而允许指定的值返回&,与==运营商进行比较。

0
(-1 == __whatever__) 

减少错字

6

有几个人赞成第二种的主张。我不同意他们。虽然(显然)最初有一个小问题===在第一个,我认为这是一个小问题。

一个更大的问题是,人们(尤其是如果他们急于)忽略错误检查 - 完全忽略if (whatever == -1),通常根据他们正在工作的理论上快速,一次性代码和检查错误是不是真的需要。这真是坏习惯;我几乎可以保证每个读过这个的人都看到真的这样的代码跳过错误检查,即使它确实应该有它。

在这样的代码中,试图打开文件并检查是否有错误,因此应该与不可约束地绑定在一起。将两者置于同一声明中反映了正确的意图。将两者分开显然是错误的 - 他们应该以任何方式在任何时间出于任何原因以任何方式分离而不是。这应该被编码为单个操作,因为它应该是的单个操作。它应该始终被认为和编码为一个单一的操作。

在我看来,这样做的借口是相当薄弱的。实际情况是,任何使用C 的人都需要才能阅读将条件测试与条件测试相结合的代码。只是一个明显的例子,像while ((ch=getchar()) != EOF)几乎需求循环写入作为组合的分配和测试 - 在尝试测试EOF分别通常会导致代码,只是不能正常工作,如果你这样做使它工作正常,代码要复杂得多。

同样,-==的问题。由于我没有看到缺陷开始,所以我不确定这两个人为了避免问题而做了多少分离,但我的直接猜测是,它可能几乎没有任何区别。编译器会提醒你什么时候应该是一个条件只包含一个任务已经存在多年(如gcc)。在大多数情况下,无论如何,症状几乎立即显而易见 - 简而言之,事实上,您在本帖的某一部分中犯了特定错别字,但没有证明其中的任何部分(甚至无法表明)两者的困难。基于这种证据,我显然认为“不”比“立即”更难打字,因为我只是在没有问题的情况下键入“立即”,但必须纠正“不”(两次以上),没有更少),然后才出现在前面的句子中。我很确定,如果我们错误地多次输入它,“这个”是英语中最难的单词。

3

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

更艰巨的情况是,当它在一个循环中,如:

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

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

在这样的情况下,我宁愿做在同一行,因为那时它明确是什么控制循环,我认为这会覆盖赋值和测试复杂组合的缺点。

+0

你的第一种方式(他的第二种方式)对于一个while循环来说非常正常。 – 2010-04-29 04:07:50

+0

@Ken:恩,是的。我并没有试图说我认为我刚发明了这个想法。只是投票,我认为这是在WHILE语句中的好风格,但在IF语句中风格不好。 – Jay 2010-04-29 04:15:30

+0

我不是故意暗示你以为。我只是补充说:“这不仅仅是一个好主意:它是约定”。 – 2010-04-29 13:57:00

0

第一种情况是非常正常在编写输入循环时是正常的,因为替代方法是必须将输入命令写两次 - 一次在循环之前,一次在循环结尾。

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

我认为第二种方法对于if语句更为正常,在这种情况下,您没有同样的担忧。

+0

你可以这样做(ch = getchar(),ch!= -1)。 – Spidey 2012-04-12 19:02:41