tengo este pedazo de código en C++:uso confuso de una coma en una sentencia 'if'
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
Pero ¿cómo se vería en C#?
tengo este pedazo de código en C++:uso confuso de una coma en una sentencia 'if'
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
Pero ¿cómo se vería en C#?
Significa esto:
if (y[0]>y[1])
{
inhi = 1;
ihi = 0;
} else {
inhi = 0;
ihi = 1;
}
o escrita de otra manera (en C++):
inhi = (y[0]>y[1]);
ini = !inhi;
yah, estaba pensando lo mismo que su segunda versión si fueran básicamente bools. – RAL
El operador coma une inferior a la asignación, por lo que la expresión
inhi=1,0
conjuntos inhi
-1
y, a continuación, devuelve 0
. Asimismo
inhi=0,1
conjuntos inhi
a 0
y devuelve 1
. Todo esto es equivalente a
if(y[0] > y[1]) {
inhi = 1;
ihi = 0;
} else {
inhi = 0;
ihi = 1;
}
Sugiero reescribirlo de esta manera, si se puede. inhi
y ihi
parecen tener el mismo propósito (en esta declaración), y el operador ternario de combinación (?:
) y el operador de coma que tiene le dan diferente peso.
esto está claro, gracias por la explicación Jesse, la razón por la que estaba después de una traducción (de C++ a C#) fue que como dijiste el (? :) y el uso de la coma no compilaba en C#. – Victor
El comma operator evalúa los argumentos a su vez y luego devuelve la última expresión evaluada. Es decir. si tuviera el siguiente código
int four = 2 + 2, mul(2,2), 4;
un compilador estrictamente siguiendo-la especificación no optimizar en primer lugar agregar 2 y 2 y luego descarta el resultado, a continuación, llamar a la función mul
y descartar el valor de retorno y, finalmente, evaluar 4 que luego se asigna a la variable i
.
Observe que después de cada coma hay un sequence point, por lo que se han realizado todos los efectos secundarios de las evaluaciones anteriores. P.ej. en
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
la asignación a inhi
está hecho y terminado antes de ihi
se actualiza. Y también significa que un compilador no puede optimizar la llamada a mul
en el ejemplo anterior a menos que sepa 100% con certeza que la función mul
no tiene ningún efecto secundario aparte de devolver un valor. Eso normalmente no es algo que el compilador sabe, aunque en C++ es posible marcar funciones como const
mediante las cuales se le dice al compilador.
-1, la primera línea no compilará y 'const' no funciona de la manera que usted describe en el último párrafo. – avakar
¿qué tipos son ihi e inhi? – RAL
discúlpeme sí cs = C# y ihi e inhi son ambos tipos de interger – Victor
@Byers IMHO http://en.wikipedia.org/wiki/C_Sharp_(programming_language) –