C 表达式必须是可修改的左值

C Expression must be a modifiable lvalue

我正在努力解决 C 代码中的错误。

#define MAX(i, limit) do \
{ \
if (i < limit) \
{ \
i++; \
} \
} while(1)
void main(void)
{ 
MAX(0,3);
}

这会导致以下错误。

Error[Pe137]: expression must be a modifiable lvalue

有什么想法吗?提前谢谢你。

对于根据 C 标准的初学者,不带参数的函数 main 应声明为

int main( void )

您向宏传递了 MAX 整数常量 0。您不能增加它。

实际上宏展开为以下代码

do
{
   if ( 0 < 3 )
   {
      0++;
   }
} while(1);

宏不是函数。因此,在您的宏中,执行了直接替换 i 和 0 和 3 的限制。

您可以声明一个变量并用值 0 对其进行初始化,然后将其传递给宏。在这种情况下,您将得到一个无限循环。

在此用例中,您尝试递增 0,这是不可能的。

do {} while 在这种情况下完全没有意义。

我会这样写:

#define MAX(i, limit)  (((i) < (limit)) ? (i) + 1 : (i))  

void main(void)
{ 
    int i = 5;
    i = MAX(i, 7);
    printf("%d\n", MAX(0,3));
    printf("%d\n", i);
    MAX(0,3);  // this statement has no effect
}

并且(可能)您不会尝试:

0 = MAX(0,3);

你需要记住这是宏,ilimit 将被计算多次,因为它们在宏中。示例:

#define MAX(i, limit)  (((i) < (limit)) ? i + 1 : i)

int y = 1;
int increase(void)
{
    y++;
}

void main(void)
{ 
    printf("%d\n", MAX(increase(),3));
}

某些表达式可能会导致未定义的行为:

#include <stdio.h>
#define MAX(i, limit)  (((i) < (limit)) ? i + 1 : i)

int y = 1;

void main(void)
{ 
    printf("%d\n", MAX(y++,3));
}