优先规则== over =

时间:2010-04-29 02:54:06

标签: c operator-precedence

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

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;
}

非常感谢任何建议,

10 个答案:

答案 0 :(得分:12)

哎呀,分开吧。将一切都压在一条线上你会得到什么?让我们进行比较和对比:

单行:

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

多行:

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

我认为很清楚。 :)


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

那很好,但这不是这里的情况。 次,不分割时更有意义,但一般,不要。


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

如果一条线路无法查看该功能,您需要1)购买分辨率高于640x480的显示器,以及2)编写较小的功能。

真的,我从不理解任何事情的论证,函数应该轻松适合任何屏幕,无论是否存在单行差异。


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

不是真的,把它推到一条线上可能更难以阅读,看起来更复杂。拆分事项使得一次处理一个比特变得更简单,不应该假设两条线使它复杂两倍。

答案 1 :(得分:6)

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

一个更大的问题是人们(特别是如果他们赶时间)跳过错误检查是非常普遍的 - 完全忽略if (whatever == -1),通常基于他们的理论正在研究的是快速,一次性的代码,并不是真的需要检查错误。这是真正的坏习惯;我几乎可以保证每个阅读此内容的人都会看到真正的代码,这些代码会跳过这样的错误检查,即使它真的应该有它。

在这样的代码中,尝试打开文件并检查错误,不可分割地绑定在一起。将两者放在同一语句中反映了正确的意图。将两者分开是完全错误的 - 他们应该 以任何方式随时以任何方式分开。这应该编码为单个操作,因为它应 单个操作。应始终将其视为单个操作并编码。

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

同样,问题是-==。由于我没有看到开始时的缺陷,我不确定这两者在避免出现问题方面会有多大分离,但我的直接猜测是它可能几乎没有任何区别。编程器会在一个条件只包含一个赋值的情况下警告你多年(例如gcc)。在大多数情况下,无论如何,症状几乎立即显而易见 - 简而言之,你在这个帖子的一部分而不是另一部分中发生特定拼写错误的事实并不证明(或者说实际上甚至表明)关于亲属的任何事情。这两个人的困难。

根据这种证据,我显然认为“不是”比“立即”更难打字,因为我只是“立即”输入没有问题,但必须纠正“不”(在上一句话中出现之前,两次,并没有减少。我很确定如果我们经常输错,“这是英语中最难的单词。”

答案 2 :(得分:3)

也许是括号使排序明显的东西?

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

答案 3 :(得分:3)

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

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

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

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

在这样的情况下,我更喜欢在一行上进行,因为它清楚地说明了控制循环的内容,我认为这会克服复杂的赋值和测试组合的缺点。

答案 4 :(得分:2)

它是一种风格的东西 - 你不是要求优先权(不是总统)。

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

第二个更好的可读性,但我知道我经常做第一个。 =运算符优先,特别是因为您在引号中使用它,允许返回指定的值&由==运算符进行比较。

答案 7 :(得分:1)

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

答案 8 :(得分:0)

(-1 == __whatever__) 

尽量减少拼写错误

答案 9 :(得分:0)

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

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

我认为第二种方式对于if语句更为正常,因为你没有同样的关注。