左值作为赋值的左操作数

时间:2014-04-23 06:15:28

标签: c

我无法编译这个程序。任何人都告诉我告诉我哪里出错了。

int i = 8, j, k;
++i = ++j = ++k = 8;
printf("\n %d \t %d \t %d",i,j,k);

它给出了错误
error : lvalue required as left operand of assignment

4 个答案:

答案 0 :(得分:5)

++i不是左值(之所以这么命名是因为它们通常可以出现在赋值的左侧)。

正如标准所述(C11 6.3.2.1):

  

左值是一个表达式(对象类型不是void),可能指定一个对象。

i本身是一个左值,但是这样预先递增就意味着它不再如此,++i是一个不代表任何特定对象的表达式。

答案 1 :(得分:1)

除了已经说过的内容之外,您不应该试图故意模糊代码。您已设法做到这一点,以至于您不了解自己的代码。写作编写实践会好得多:

int i = 8;
int j = 0;
int k = 0;

++i;
++j;
++k;

i = 8;
j = 8;
k = 8;

printf("\n %d \t %d \t %d", i, j, k);

现在,当我们修改编码样式以在单独的行上使用声明时,很明显j和k没有被初始化。我修复了上面的错误。

答案 2 :(得分:0)

"需要左值"意味着您无法为内存中没有位置的内容分配值。基本上你需要一个变量才能分配一个值。 在这种情况下,您的变量具有++运算符,它既充当语句又充当赋值

答案 3 :(得分:0)

++i = ++j = ++k = 8;

无效。 ++运算符既作为语句又作为赋值,因此您无法分配它并在右侧提供值。你可以做到

i = j = k = 8;

i++; j++; k++;

这两者具有非常不同的含义。看起来你可能想要做第一个,因为你从不分配j或k并且增加它们没有意义。