c - C如何推断 "assignable values"/l-values

标签 c dereference lvalue

这让我很困惑:

#include <stdio.h>

int main(int argc, char** argv) {
  int a = 0, b = 1;
  int *ptr = argc <= 1 ? &a : &b;
  (*ptr)++; //does work, of course

  (*(argc <= 1 ? &a : &b))++; //inlining, does also work

  int *ptr_a = &a;
  int *ptr_b = &b;

  (*(argc <= 1 ? ptr_a : ptr_b))++; //variables carry "assignability"

  (argc <= 1 ? *ptr_a : *ptr_b)++; //if-expression does not carry "assignability"?

  return 0;
}

我一直认为“可分配性”是一种类型属性。因此,我认为最后一条语句应该可以正常工作,而不是被拒绝。那么,为什么取消引用必须是最外层的运算符,C 编译器才能确定 lhs 实际上是一个内存位置?

编辑:我怀疑它与操作系统/编译器有关,但与 C 标准有关,但这是我的编译器设置:

clang version 3.3 (tags/RELEASE_33/final)
Target: x86_64-redhat-linux-gnu
Thread model: posix

这里是错误:

test.c:15:32: error: expression is not assignable
  (argc <= 1 ? *ptr_a : *ptr_b)++; //if-expression does not carry "assignability"?

edit2:我最感兴趣的是,为什么 C 似乎通过一些但不是所有的表达式带有“assignability”属性。

最佳答案

在 C 中,三元运算符总是返回一个右值 - Conditional operator differences between C and C++

在第二个示例中,您直接对其应用后增量,但该运算符需要一个左值,因此它不是有效代码。

在第一个示例中,您执行指针取消引用,将其转换为左值,因此代码是有效的。

关于c - C如何推断 "assignable values"/l-values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22554663/

相关文章:

pointers - 为什么指向int的指针是使用 “*int”而不是 “&int”初始化的?

c++ - 在编码程序中使用自己的堆栈类 - 确定大小和顶部

c++ - 对类型的非常量左值引用无法绑定(bind)错误

c - Linux 仅对原始套接字使用接口(interface)

c - 带有 SDL2 的 Makefile C

c - 在 C 中取消引用和将变量的地址分配给指针变量有什么区别?

c++ - 模板参数的引用变量的问题

c - 如何检查 union 中当前使用的是什么类型?

c - c中带有数组的结构的结果不一致

c++ - 在什么情况下调用常量取消引用运算符?