C如何推断;“可分配值”l值

C如何推断;“可分配值”l值,c,dereference,lvalue,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

这让我很困惑:

#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;
}
下面是错误:

test.c:15:32: error: expression is not assignable
  (argc <= 1 ? *ptr_a : *ptr_b)++; //if-expression does not carry "assignability"?
test.c:15:32:错误:表达式不可赋值

(argc注意,当应用于指针时,Dereference
*
运算符返回一个l值
万一

(*(argc <= 1 ? &a : &b))++;
&a
返回
a
的地址,延迟它将返回一个l值

万一

(argc <= 1 ? *ptr_a : *ptr_b)++;  
(argc假设

  int a = 0, b = 1;
  int *ptr_a = &a;
  int *ptr_b = &b;
我们可以增加变量的值意味着有一些位置。
如果试图修改常数,则会得到错误L值required表示需要位置,常数没有任何位置,因此会出现错误。

在C中,三元运算符总是返回一个r值-

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


在第一个示例中,执行指针解引用,将其转换为l值,因此代码有效。

问题在于C中的条件运算符提升第二个和第三个操作数以相互匹配。提升的变量是右值而不是左值,因此?:始终返回右值


另一方面,*运算符返回一个左值。这就是为什么
(*(argc)好吧……假设添加指针是有意义的:可以将某个内容分配给
*(ptr_a+ptr_b)
,但不能分配给
*ptr_a+*ptr_b
。这里没有其他内容。这两个表达式不同(第一个添加地址,第二个添加值)同样,除了语法之外,使用*ptr_a+*ptr_b也不是问题,您正在添加两个值,例如a和b。错误是什么。是否需要L值。请分享您的错误。@asifaftab87:是的,我知道我知道我们不能在三元运算符中使用条件语句,但我没有发现什么问题。请提及您的错误,OS和compiler。这些信息将帮助我解决你的问题。我不理解解释。在你写的第一句话中,它返回一个l值。并且首先计算解引用,就像在第二个例子中一样,不是吗?那么有什么区别吗?@KarolyHorvath;好的。让我再解释一下。我认为真正的解释是关于三元运算符如何工作的详细信息。@KarolyHorvath;没有。我解释得更详细了。对不起,我不明白你的答案。在第一句中,你说的是(正确的)*产生一个l值。在最后一句中,你说的是(正确的)*是在++之前计算的。您的结论是这会产生一个r值?因此计算顺序会影响指针解引用的结果类型?您的解释是错误的。
(*ptr_a)++
是有效的代码。事实上,它被大量使用。
ptr_a
ptr_b
都是相同的类型,因此不会发生升级。
(argc <= 1 ? *ptr_a : *ptr_b)++;  
  int a = 0, b = 1;
  int *ptr_a = &a;
  int *ptr_b = &b;