-4
....
if (i<lim -1 && (c=getchar()) != '\n' && c!=EOF))
{
    ....
}
....

以这种方式编写代码的优缺点是什么。

4

2 回答 2

3

这不是很多逻辑,但它已经是你为什么不应该这样做的一个很好的例子:它导致代码难以理解和难以调试;这很像将一个句子与多个想法打包在一起,这些想法可能相关但不那么相关,以至于它们不应该出现在自己的句子中——在这两种情况下,潜在的问题是更容易持有一个,你头脑中的简单想法比处理几个相互竞争的想法,即使这些想法在某种程度上是互补的。

简单更好。

让我们看看有问题的特定代码:

if (i<lim -1 && (c=getchar()) != '\n' && c!=EOF)) {...}

这里有一个问题,实际上是一个非常简单的问题:你的括号不匹配。你有三个(但是四个),所以编译器会抱怨。我们应该通过删除第二个)还是第四个来解决这个小问题?碰巧它并不重要——结果应该是一样的。情况并非总是如此。

您认为简单的事情以及如何选择分解代码中的想法通常是一个品味问题。编写一堆嵌套if语句确实比一个if包含多个子句的语句更容易理解,这并不总是正确的。考虑:

if (i<lim -1) {
    if (c=getchar() != '\n') {
        if (c!=EOF) {
            ...

我不确定这是否真的有很大帮助。就个人而言,我会选择这样的东西:

if (( i < lim-1 ) &&
    ( c=getchar() != '\n' ) &&
    ( c != EOF ))
{ ... }

它是相同的代码,但以一种更容易阅读的方式排列。看着它,很容易对自己说:“如果以下三件事都是真的……”,并且很容易将三个条件中的每一个都挑出来。

于 2013-07-15T05:20:02.910 回答
1

我不同意@Caleb 的回答。那段代码非常简单,几乎没有逻辑。有人从输入缓冲区读取,直到达到缓冲区限制或没有更多字符可供读取。这是一段公平的代码,但没有什么可讨论的。

所以,忘记那段代码。

于 2013-07-15T05:22:10.877 回答