我在C ++中有这段代码:
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
但它在C#中看起来怎么样?
答案 0 :(得分:14)
这意味着:
if (y[0]>y[1])
{
inhi = 1;
ihi = 0;
} else {
inhi = 0;
ihi = 1;
}
或以另一种方式(用C ++编写):
inhi = (y[0]>y[1]);
ini = !inhi;
答案 1 :(得分:9)
逗号运算符绑定低于赋值,因此表达式
inhi=1,0
将inhi
设置为1
,然后返回0
。同样
inhi=0,1
将inhi
设置为0
并返回1
。这一切都等同于
if(y[0] > y[1]) {
inhi = 1;
ihi = 0;
} else {
inhi = 0;
ihi = 1;
}
如果可以的话,我建议用这种方式重写它。 inhi
和ihi
似乎具有相同的目的(在此声明中),并且您获得的组合三元运算符(?:
)和逗号运算符赋予它们不同的权重。
答案 2 :(得分:1)
comma operator依次评估参数,然后返回最后计算的表达式。即如果您有以下代码
int four = 2 + 2, mul(2,2), 4;
严格遵循规范的非优化编译器首先添加2和2,然后丢弃结果,然后调用函数mul
并丢弃返回值,最后评估4然后分配给i
变量。
请注意,每个逗号后都有一个sequence point,所以 将执行先前评估的所有副作用。例如。在
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
inhi
的作业已完成, ihi
更新前已完成。并且它还意味着编译器无法在上面的示例中优化掉mul
的调用,除非它知道100%确保mul
函数除了返回值之外没有任何副作用。这通常不是编译器所知道的,尽管在C ++中可以将函数标记为const
,通过它可以告诉编译器。