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;