在C中评估赋值运算符的左操作数有什么意义?

Jin*_*Jin 17 c evaluation assignment-operator

根据ISO C11 - 6.5.16.3,它说

  1. 赋值运算符将值存储在左操作数指定的对象中.赋值表达式在赋值后具有左操作数的值,但不是左值.赋值表达式的类型是左值操作数在左值转换后将具有的类型.在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序.对操作数的评估是不确定的.

所以我想这意味着,例如,

int x = 10;
x = 5 + 10;
Run Code Online (Sandbox Code Playgroud)
  1. 左操作数x计算为10,右操作数计算为15.
  2. 右操作数值存储在左操作数指定的对象中x.

但是如果赋值的目的是存储右操作数的evalauted值(就像在step2中那样),为什么左操作数的评估是必要的?评估左操作数有什么意义?

R S*_*ahu 27

x被评估为a时lvalue,它不会评估为10.它评估lvalue可以存储RHS值的位置.如果LHS未评估为a lvalue,则该语句将是错误的.

根据C99标准(6.3.2.1/1):

左值是表达式(具有比空隙之外的对象类型),该潜在指定的对象; 如果左值在评估时未指定对象,则行为未定义.

当你有一个简单的变量时,将LHS评估为左值是微不足道的,例如

 x = 10;
Run Code Online (Sandbox Code Playgroud)

但是,它可能更复杂.

 double array[10];
 int getIndex();   // Some function that can return an index based
                   // on other data and logic.

 array[getIndex()+1] = 10.0;

 // This looks like a function call that returns a value.
 // But, it still evaluates to a "storage area".
 int *getIndex2() { return(&array[0]); }
 *getIndex2()=123.45; // array[0]=123.45
Run Code Online (Sandbox Code Playgroud)

如果getIndex()返回5,则LHS求值为指定数组的第7个元素的左值.


tof*_*fro 15

x在您的示例中,"左操作数"可能比您的简单要复杂得多(这无疑是评估的真正挑战):

*(((unsigned long*)target)++) = longValue;
Run Code Online (Sandbox Code Playgroud)

绝对需要对LHS进行一些评估.引用的句子指的是在作业的左侧需要做什么,以便找到适当的左值来接收作业.