有人可以解释以下代码中发生的事情吗? (取自GeeksForGeeks)
int main(){
int a = 10;
++a = 20; // works
printf("a = %d", a);
getchar();
return 0;
}
执行语句++ a = 20时究竟发生了什么?另外,请澄清为什么此代码执行失败?
int main(){
int a = 10;
a++ = 20; // error
printf("a = %d", a);
getchar();
return 0;
}
答案 0 :(得分:8)
当你这样做时
++a = 20;
大致相当于
a = a + 1;
a = 20;
但是当你做的时候
a++ = 20;
大致等同于
int temp = a;
a = a + 1;
temp = 20;
但是变量temp
并不存在。 a++
的结果称为 rvalue ,无法分配。 Rvalues应该位于任务的右侧,而不是左侧。 (这基本上是l
和r
中lvalue
和rvalue
的来源。)
参见例如this values category reference有关左值和左值的更多信息。
答案 1 :(得分:1)
这是r和l值之间的差异。如果您已经使用gcc编译了第二个代码片段,您会看到:
左值作为赋值的左操作数
意思是,a++
是rvalue而不是左值,因为如果你想为它分配一些东西它应该是
答案 2 :(得分:1)
int main(){
int a = 10;
++a = 20; // works
printf("a = %d", a);
getchar();
return 0;
}
这是一种c语言。 逐行解释 int main()这一行定义了一个名为main的入口函数,它应该返回一个整数类型(int) int a = 10声明一个变量整数,其值为10; ++ a = 20;此时,在对a执行任何操作之前,您的代码将a的值递增1。 这意味着,a的值增加1,然后a指定值20; .... 语句++ a = 20在某种意义上是一个incorect,a最初是10,并且你将它增加到11。就像说11 = 20;这可能不会引发错误,因为代码行没用。 printf()是一个将文件打印到屏幕的c方法,传递一个字符串" a =%d"告诉编译器将a打印到十进制数(%d)。 getchar()用于终止正在运行的程序,返回0是强制告诉操作系统代码运行成功并返回整数值0。
int main(){
int a = 10;
a++ = 20; // error
printf("a = %d", a);
getchar();
return 0;
}
这不是a ++ = 20因为,正确的值增量在增加之前执行操作,而不像++ a在执行操作之前增加。 所以这是不可能的,它永远不会起作用,因为a已经是10,你说的是值+分配20,你不能为它赋值,它应该是计算它自己的值值。所以编译器希望解释为变量a ++ = 20,而++不能是可变名称。这就是它永远无法工作的原因。
c中增量和减量的本质是什么....它对于创建条件语句非常有用,例如for循环,而语句等等,例如:
for(int i = 0; i < 4; i++)
{
printf('THis is c-language');
}
或
int i = 0;
while(i < 4){
printf('THis is c-Language');
i++;
}
因此,遵循编程规则和规则,您不允许为++或++ a分配值 它们是供编译器操作的,所以永远不要为它们赋值。 谢谢。
答案 3 :(得分:0)
赋值运算符的左操作数应该是左值
表达式++a
是左值,而a++
不是,因此它不能是赋值运算符的左操作数。
n3797-§5.3.3(p1):
[...]结果是更新的操作数;这是一个左值[...]