混淆在'if'语句中使用逗号

时间:2010-02-26 00:15:52

标签: c# c++ if-statement

我在C ++中有这段代码:

ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);

但它在C#中看起来怎么样?

3 个答案:

答案 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;
}
如果可以的话,我建议用这种方式重写它。 inhiihi似乎具有相同的目的(在此声明中),并且您获得的组合三元运算符(?:)和逗号运算符赋予它们不同的权重。

答案 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,通过它可以告诉编译器。