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

时间:2017-08-28 09:02:36

标签: 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;
}

2 个答案:

答案 0 :(得分:1)

展开宏后,if(i++<LIMIT)变为if (0++ < 3)0++不是有效的表达式。

要使其正常工作,您可以在main()中定义一个变量,并将该变量传递给宏:

int main()
{
    int a = 0;
    PRINT(a, 3);
    return 0;
}

注意,您定义的宏实际上是一个无限循环(至少对于给定的参数)。如果您打算打印三次,则需要

#define PRINT(i, LIMIT) \
do { \
    cout<<"Gradeup";\
}while(++i<LIMIT)

答案 1 :(得分:0)

请注意,宏中定义的任何标识符都不是变量。它是一个替代标识符&#34;。所以你没有一个名为i的变量,但提供给那里的任何东西。

然后你的宏像这样展开

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

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