为什么没有效果的语句在 C 中被认为是合法的?

A. *_* W. 13 c

如果这个问题很幼稚,请原谅。考虑以下程序:

#include <stdio.h>

int main() {
  int i = 1;
  i = i + 2;
  5;
  i;
  printf("i: %d\n", i);
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,语句5;andi;似乎完全多余,但代码在默认情况下编译时没有警告或错误(但是,gccwarning: statement with no effect [-Wunused-value]在运行时确实会抛出警告-Wall)。它们对程序的其余部分没有影响,那么为什么它们首先被认为是有效的语句?编译器会简单地忽略它们吗?允许这样的陈述有什么好处吗?

Nat*_*dge 10

允许此类语句的一个好处是来自由宏或其他程序创建的代码,而不是由人类编写的。

例如,假设一个函数 int do_stuff(void)应该在成功时返回 0 或在失败时返回 -1。可能是对“东西”的支持是可选的,所以你可以有一个头文件

#if STUFF_SUPPORTED
#define do_stuff() really_do_stuff()
#else
#define do_stuff() (-1)
#endif
Run Code Online (Sandbox Code Playgroud)

现在想象一下,如果可能的话,一些代码想要做一些事情,但可能会或可能不会真正关心它是成功还是失败:

void func1(void) {
    if (do_stuff() == -1) {
        printf("stuff did not work\n");
    }
}

void func2(void) {
    do_stuff(); // don't care if it works or not
    more_stuff();
}
Run Code Online (Sandbox Code Playgroud)

STUFF_SUPPORTED为 0 时,预处理器会将调用扩展为func2仅读取的语句

    (-1);
Run Code Online (Sandbox Code Playgroud)

因此编译器传递只会看到似乎困扰您的那种“多余”的语句。然而,人们还能做什么呢?如果你#define do_stuff() // nothing,那么代码func1就会中断。(而且你仍然会有一个空语句,func2它只是 read ;,这可能是多余的。)另一方面,如果你必须实际定义一个do_stuff()返回 -1的函数,你可能会产生函数调用的成本没有充分的理由。