Jin*_*Jin 17 c evaluation assignment-operator
根据ISO C11 - 6.5.16.3,它说
- 赋值运算符将值存储在左操作数指定的对象中.赋值表达式在赋值后具有左操作数的值,但不是左值.赋值表达式的类型是左值操作数在左值转换后将具有的类型.在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序.对操作数的评估是不确定的.
所以我想这意味着,例如,
int x = 10;
x = 5 + 10;
Run Code Online (Sandbox Code Playgroud)
x
计算为10,右操作数计算为15.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进行一些评估.引用的句子指的是在作业的左侧需要做什么,以便找到适当的左值来接收作业.