I have this piece of code in c++
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
But how would it look in C#?
Many thanks,
I have this piece of code in c++
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
But how would it look in C#?
Many thanks,
The comma operator binds lower than assignment, so the expression
inhi=1,0
sets inhi
to 1
, and then returns 0
. Likewise
inhi=0,1
sets inhi
to 0
and returns 1
. This whole thing is equivalent to
if(y[0] > y[1]) {
inhi = 1;
ihi = 0;
} else {
inhi = 0;
ihi = 1;
}
I'd suggest rewriting it this way, if you can. inhi
and ihi
seem to have the same purpose (in this statement), and the combination ternary operator (?:
) and comma operator that you've got give them different weight.
It means this:
if (y[0]>y[1])
{
inhi = 1;
ihi = 0;
} else {
inhi = 0;
ihi = 1;
}
Or written another way (in C++):
inhi = (y[0]>y[1]);
ini = !inhi;
The comma operator evaluates the arguments in turn and then returns the last evaluated expression. I.e. if you had the following code
int four = 2 + 2, mul(2,2), 4;
a strictly-following-the-specification non-optimizing compiler would first add 2 and 2 and then discard the result, then call the function mul
and discard the return value and finally evaluate 4 which then is assigned to the i
variable.
Notice that after each comma there is a sequence point, so all side effects of the previous evaluations will have been performed. E.g. in
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
the assignment to inhi
is done and finished before ihi
is updated. And it also means that a compiler can not optimize away the call to mul
in the example above unless it knows 100% for sure that the mul
function does not have any side effects other than returning a value. That is normally not something the compiler knows, although in C++ it is possible to mark functions as const
by which the compiler is told so.