这让我很困惑:
#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/