在一行代码中理解 index++

Understanding index++ in single line of code

本文关键字:index++ 代码 一行      更新时间:2023-10-16

这是合并排序实现的代码片段的一部分,我很难理解这一行:

b[bIdx++] = (a[left] <= a[right]) ? a[left++] : a[right++];

我正在重写上面的片段以检查我对这条线的理解。我对上述行的理解是否正确?

if (a[left] <= a[right]){
b[bIdx] = a[left];
left++;
}
else { 
b[bIdx] = a[right];
right++;
}
bIdx ++;

你的理解是正确的。

后缀递增运算符++计算为其操作数的当前值,并作为副作用递增其操作数。 增量的效果保证在下一个序列点可见。

序列点出现在每个语句之后,但它可能出现在基于运算符的表达式中。 创建序列点的运算符示例包括逻辑 AND 运算符&&、逻辑 OR 运算符||、逗号运算符,,以及三元运算符?:

分解单行语句,首先评估条件a[left] <= a[right]。 现在,在评估的这一阶段有一个序列点。 根据此条件的结果,评估a[left++]a[right++],并将评估的变量分配给b[bIdx++]。 语句末尾有一个序列点,此时bIdx递增,leftright递增。

以上反映在代码的多语句版本中。 首先评估条件,然后b[bIdx]分配a[left]a[right],然后递增leftright,然后递增bIdx

您重写的代码等效于上面的一行代码。

单行使用后缀增量运算符,其中计算表达式的值,即a[left]的计算值为left,之后操作数left递增 1。

另请注意,还存在一个前缀递增运算符,其中操作数递增 1,之后计算表达式的值。

我对上述行的理解是否正确?
正确。
我们将消除疑虑,确保

if (a[left] <= a[right]){
b[bIdx] = a[left];
++left;
}
else { 

b[bIdx] = a[right];
++right;
}
++bIdx;

其他空间(例如上面的(用于填充代码,如果您有更多条件,例如

b[bIdx++] = (a[left] < a[right]) ?  a[left++] : ( a[left++] == a[right] ? (++right, 1)  : a[right++] );