为什么在执行以下 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
没有意义。你需要使用一个变量。
#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
没有意义。你需要使用一个变量。