【问题标题】:C: variable suddenly changes (why does that happen?)C:变量突然改变(为什么会这样?)
【发布时间】:2012-08-24 14:54:16
【问题描述】:

当我玩弄一些在线网站提供的代码时,我遇到了一个我从未预料到的奇怪故障:一个变量突然改变了它的值而没有任何手动赋值。

下面是代码:

int rc = fwrite(conn->db, sizeof(struct Database), 1, conn->file);
printf("rc is equal to %d\n", rc); // should print out 1
if (rc != 1) die("Failed to write Database.");

rc = fflush(conn->file);
printf("rc is equal to %d\n", rc); // should print out 0
if (rc == -1); die("Cannot flush database"); // error handling
// error comes up because rc suddenly changes to -1

我不明白它是怎么发生的,但想知道为什么一个变量在 C 中不应该发生变化时突然发生变化。

代码来源: http://c.learncodethehardway.org/book/learn-c-the-hard-waych18.html (Database_write下的堆栈和内存)

顺便说一句,我在 Mac osx 10.6 雪豹的终端中使用 vim。

【问题讨论】:

  • 注意:如果您使用-Wall -Wextra 编译,GCC 会准确地告诉您错误在哪里。 Clang 会默认告诉你。
  • 低悬的水果抽奖......也许我们可以得到另外十几个提到额外分号的答案。

标签: c variable-assignment


【解决方案1】:

它不会更改为 -1。它仍然为零。 您的代码中有一个分号 (;),您不应该在其中使用它。 您应该改为:

if (rc == -1) die("Cannot flush database");

【讨论】:

  • @JBRPG:因为我自己弄的这些错字,我掉了一半头发;)
【解决方案2】:

rc 的值没有改变,而是你的if 语句有问题:

if (rc == -1); die("Cannot flush database");
             ^

第二个if-statement 没有与之关联的操作。除非; 被删除,否则die() 将始终执行,而不管rc 的值如何。即,改用这个:

if (rc == -1) die("Cannot flush database");
             ^

【讨论】:

    【解决方案3】:

    你有一个小错误

     if (rc == -1);
                  ^
                  ^
    

    这样 die 语句总是被执行。条件的值被检查并且从未使用过

    【讨论】:

      【解决方案4】:

      这是错误:

      if (rc == -1); die("Cannot flush database"); // error handling
      

      由于您的;if 之后,die 超出了您的if 的范围。如果您不编写结构化代码,这种错误是非常可能和频繁的。这应该是:

      if (rc == -1)
      {
          die("Cannot flush database"); // error handling
      }
      

      如果你在if 之后有一个;,你会立即看到。

      【讨论】:

        【解决方案5】:

        如前所述,分号是您的问题。

        你在这里所做的,虽然不是你想要的,但完全合法——它被称为空语句。这被写成一个分号,没有别的。 if 语句,如果为真,实际上是在继续执行一个语句——只是一个空语句。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-11
          • 1970-01-01
          • 2016-07-13
          • 2013-05-24
          • 2016-06-05
          • 1970-01-01
          • 2017-06-30
          相关资源
          最近更新 更多