C 优先规则==优先于=

C 优先规则==优先于=,c,operator-precedence,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; } 非常感谢您的

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

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

非常感谢您的建议,

这是一种风格-您没有要求优先权(不是主席)


许多人会认为后一个例子更清楚。

哎呀,把它分开。在一条线上把所有的东西都捣碎,你会得到什么?让我们比较一下:

单线:

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

  • 优点:易于阅读,不易出错
  • 缺点:
我想这很清楚


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

没关系,但这里不是这样。有些时候,不将其拆分更有意义,但一般来说,不要这样做


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

如果有一行代码破坏了您查看功能的能力,您需要1)购买分辨率高于640x480的显示器,2)编写更小的功能

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


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


不完全是这样,把它放在一行可能更难阅读,看起来也更复杂。将事情拆分会使一次处理一点变得更简单,我们不应该假设两行代码会使其复杂度增加一倍。

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

也许是圆括号使排序更明显的地方

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

除了标准的习语——这些习语非常常见,以至于每个人都能立即得到你想要做的事情——我会避免在条件语句中进行赋值。首先,它更难阅读。第二,你可以在条件检查中使用错误的赋值运算符来创建bug(至少在弱类型语言中是这样的,这些语言将零解释为false,将非零解释为true)。

为了可读性起见,第二个更好,但我知道我经常做第一个。
=
操作符将优先,特别是因为它在引号中,允许
=
操作符返回和比较指定的值

(-1 == __whatever__) 

为了尽量减少打字错误,有几个人主张使用第二种。我不同意他们的看法。虽然(显然)在第一个问题中,
=
=
最初存在一个小问题,但我认为这是一个小问题

一个更大的问题是,人们(尤其是在匆忙中)跳过错误检查太普遍了——完全忽略
if(whatever==-1)
,通常是基于这样一种理论,即他们正在处理的是快速、一次性的代码,并且不需要检查错误。这真是个坏习惯;实际上,我可以保证每一个阅读本文的人都看到过像这样跳过错误检查的真实代码,即使它真的,真的应该这样做

在这样的代码中,尝试打开文件并检查错误应该是不可分割的。将两者放在同一句话中反映了正确的意图。将两者分开显然是错误的——它们不应该在任何时候以任何方式以任何理由分开。应将其编码为单个操作,因为它应为单个操作。应始终将其视为单个操作并进行编码

在我看来,不这样做的理由是相当薄弱的。事实上,任何使用C语言的人都需要能够阅读将赋值与条件测试相结合的代码。举个明显的例子,像
while((ch=getchar())!=EOF)
这样的循环非常需要作为一个组合的赋值和测试来编写——尝试分别测试
EOF
通常会导致代码无法正确工作,如果您确实让它正确工作,代码就会变得更加复杂

同样地,
-
==
的问题。由于我一开始没有看到缺陷,我不确定将两者分开会有多大程度上避免问题,但我的直接猜测是,这可能几乎没有任何区别。当本应为条件的内容仅包含赋值时,将向您发出警告的编译器已存在多年(例如gcc)。在大多数情况下,症状几乎立刻就明显了——简言之,你在这篇文章的一部分中犯了一个特殊的打字错误,但在另一部分中没有,这一事实并不能证明(或者诚实地说,甚至表明)这两个部分的相对困难


基于这类证据,我显然认为“不”比“立即”更难输入,因为我只是毫无问题地“立即”输入,但在“不”(两次,不少于)在前一句中正确出现之前,我必须纠正它。我很确定,如果我们看一下我打错的频率,“the”是英语中最难的单词。

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

更困难的情况是当它处于循环中时,如:

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

while (true)
{
  c=getchar();
  if (c==-1)
    break;
  ... do something ...
}
在这种情况下,我更喜欢在一行上完成,因为这样可以清楚地知道是什么在控制循环,我认为这克服了分配和测试复杂组合的缺点。

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

while ( (ch=getchar()) != -1){
  //do something with it
}
我认为第二种方法对于if语句更为正常,因为您没有同样的顾虑。

您似乎有