C++ 编译错误。正确的代码和输出是什么?

C++ 编译错误。正确的代码和输出是什么?,c++,c++11,C++,C++11,为什么第3行需要编译错误值 正确的代码和输出是什么 #include<iostream> #define PRINT(i,LIMIT) \ do{ if(i++<LIMIT)\ { cout<<"Gradeup";\ continue; }\ }\ while(1) using namespace std; int main() { PRINT(0,3); return 0;

为什么第3行需要编译错误值

正确的代码和输出是什么

 #include<iostream>
 #define PRINT(i,LIMIT) \
  do{   if(i++<LIMIT)\
       { cout<<"Gradeup";\
         continue;  }\
         }\
       while(1)

using namespace std;


int main() {  

PRINT(0,3);
return 0;
}

展开宏后,ifi++只需注意宏中定义的任何标识符都不是变量。它是一个替换标识符。所以你没有一个名为i的变量,但是这里提供了任何东西

然后宏会像这样展开

PRINT(0, 3);
// Expand result
do{   if(0++<3)
...

编译器肯定在抱怨0++不是有效的表达式。0是右值,因此不能与需要左值的增量运算符一起使用。

ifi++展开宏,在预处理阶段后查看它,当您遇到与宏有关的问题时总是很好的,您将了解发生了什么。请记住,预处理器及其宏与函数不同,宏的参数也不是变量。。。为了你自己的心理健康,不要试图用宏来代替函数。不清楚你想要什么,代码不编译,所以没有输出如果你想知道输出,然后把PRINT转换成你调用的函数,然后构建它并查看输出。不是一个无效的表达式-实际上它是一个无效的表达式。或者你的意思是它不是一个有效的@说书人,你说得对。对不起,那是个打字错误。正如@mch指出的,0不是l值,不能增加。
#define PRINT(i, LIMIT) \
do { \
    cout<<"Gradeup";\
}while(++i<LIMIT)
PRINT(0, 3);
// Expand result
do{   if(0++<3)
...