为什么在执行以下 C 代码时出现错误 "Expression Syntax":

Why am I getting the error "Expression Syntax" while executing the following C code:

#include<stdio.h>
#define PRINT(a,b) (while(a<b){printf("%d < %d\n",a,b); ++a;})
int main(void)
{
  PRINT(1,5);
  return 0;
}

我收到 PRINT(1,5);

行的表达式语法错误

您在评论中得到了错误原因的解释。为了得到正确的,你可以这样做 -

#define PRINT(a,b)        \
for(int i=(a);i<(b);i++)   \
 {                          \
    printf("%d < %d\n",i,b); \
 }

正如 "Cool Guy" 编译器所说 "sees" 传递给宏的值,就像您将它们键入出来一样,而不是变量,绝对不是实际键入的变量。

你想要的大概是:

#define PRINT(a, b) int c=(a);while(c<(b)){printf("%d < %d\n", c, (b));++c;}

不过为了说得更清楚...

#define PRINT(a, b)                   \
    int c = (a);                      \
                                      \
    while (c < (b)) {                 \
        printf ("%d < %d\n", c, (b)); \
        ++c;                          \
    }

不过,这是假设您确实需要一个 while 循环。

否则使用 for 循环,它更简单、更干净。

C 编译器正在查看 C language preprocessor 的代码输出。您可以直接 运行 预处理器来找出编译器遇到问题的已处理代码的哪一部分。了解预处理器的工作原理后,您将能够发现此类错误,而无需执行此操作。

在我的 gnu gcc 环境中,cpp 完成工作:

% cpp <your source file name>

会打印很多代码,但最后你会看到

int main(void)
{
  (while(1<5){printf("%d < %d\n",1,5); ++1;});
  return 0;
}

你看到这里有什么问题了吗? while语句不是表达式,所以不能用()括起来。接下来,++1 是不允许的,因为 1=1+1 没有意义。你需要使用一个变量。