2010-02-26 17 views
13

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#?

+0

¿qué tipos son ihi e inhi? – RAL

+0

discúlpeme sí cs = C# y ihi e inhi son ambos tipos de interger – Victor

+0

@Byers IMHO http://en.wikipedia.org/wiki/C_Sharp_(programming_language) –

Respuesta

14

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; 
+0

yah, estaba pensando lo mismo que su segunda versión si fueran básicamente bools. – RAL

9

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.

+0

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

1

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.

+0

-1, la primera línea no compilará y 'const' no funciona de la manera que usted describe en el último párrafo. – avakar

Cuestiones relacionadas