首页 > 解决方案 > 检测表达式是C中的左值还是右值

问题描述

有什么方法可以确定给定表达式是 C 中的左值还是右值?例如,是否存在is_lvalue具有以下行为的函数或宏:

int four() {
    return 4;
}

int a = 4;

/* Returns true */
is_lvalue(a);

/* Returns false */
is_lvalue(four());

我知道C++ 中存在等效功能,但是在任何 C 标准中都有什么方法可以做到这一点?我对特定于 GCC 的扩展不是特别感兴趣。

感谢您的时间。

标签: c

解决方案


C 标准没有提供任何方法来检测表达式是否为左值,要么通过根据操作数是否为左值而使某些操作具有不同的值,要么通过生成翻译时诊断消息或错误,具体取决于关于操作数是否为左值。

C 实现当然可以定义提供此功能的扩展。

最接近严格符合 C 的方法是尝试使用 address-of operator 获取表达式的地址&。如果它的操作数不是左值,这将产生一个诊断消息(并且,在典型的 C 实现中,一个错误)。但是,它也会为作为位域或用 声明的左值生成一条消息register。如果这些被排除在感兴趣的案例之外,那么它可能有助于在程序翻译期间区分左值和非左值。


推荐阅读