2011-02-17 13 views
18

Acabo de encontrar un código que no estaba haciendo lo que pensé que debería. ¿Otras personas piensan que esto debería devolver 1? ¿Hay una buena explicación de por qué no?¿Qué devuelve "count ++" en C#?

int count = 0; 

count++.ToString(); // Returns 1 no? 

Siempre pensé recuento ++ fue el mismo que count = count + 1 ...

+1

¿qué pasa con (Count ++) ToString().? –

+1

@J Angwenyi: Eso no cambia nada. –

Respuesta

46

x++ es un operador después de la subasta. Significa que el valor de x se incrementa, pero se devuelve el antiguo (no incrementado) de x (0 en su caso, al que se aplica ToString). Para obtener el comportamiento que desea, utilice el operador de incremento pre++x.

+0

dulce ... todos estos años y pensé que el posicionamiento de ++ era solo preferencia del programador.cheers – swingdoctor

+1

@swingdoctor Suposiciones: la madre de todos ...;) –

+1

'++ x' también puede ser más rápido que' x ++ 'en algunos idiomas (porque el valor original debe ser copiado y almacenado por separado para ser devuelto con la publicación -incremento). En general, creo que es una buena idea usar siempre el operador de preincremento ya que el operador de incremento posterior raramente tiene el resultado esperado cuando la diferencia es importante. –

2
(++i).ToString(); 

hace exactamente lo que usted espera.

+0

Es una rareza del compilador. C++. ToString() compila, pero ++ c.ToString() no ... Sin embargo, la conversión implícita del ++ c funcionará por lo tanto (++ c) .ToString(). Weird ... – code4life

+0

@ code4life: No es una rareza, solo una consecuencia de la precedencia de enlace del operador ... '++ c.ToString()' es un intento de preincrementar la cadena devuelta por 'ToString()' –

8

x ++ es un incremento posterior; el valor actual (0) se usa como resultado, luego ocurre ++.

Un poco como:

var tmp = count; 
count++; 
Consle.WriteLine(tmp); 

El pre-incremento (++ x) se comportaría como se esperaba.

1

Su código original mostrará siempre 0.

Prueba esto:

(++c).ToString(); 

Esto devolverá 1.

From the MSDN site:

La primera forma es un incremento de prefijo operación. El resultado de la operación es el valor del operando después de que se haya incrementado .

La segunda forma es una operación de incremento de posfijo . El resultado de la operación es el valor del operando antes de que se haya incrementado .

+0

La última oración es absolutamente mal El incremento siempre ocurre * antes * de la llamada a ToString() independientemente de la posición de ++. Si no me cree, pruébelo: static clase X {public static void M (this int x) {Console.WriteLine (C.c); }} clase C {int public static int c = 0; vacío estático Main() {(C.C++). M(); }} Como puede ver, el incremento de C.c ocurre ** antes de la llamada **, no ** después de la ejecución de la línea **. C# garantiza que los efectos secundarios ocurran en orden de izquierda a derecha. –

+0

Consulte http://stackoverflow.com/questions/3346450/c-what-is-the-difference-between-i-and-i/3346729#3346729 para obtener más información. –

+0

¡Ack! Editaré – code4life

-2

No, ++ count return "1". count ++. ToString() ejecuta el método ToString() y luego incrementa el conteo, por lo que devuelve "0".

+0

La segunda oración es incorrecta. Consulte http://stackoverflow.com/questions/3346450/c-what-is-the-difference-between-i-and-i/3346729#3346729 por el motivo. –

+0

Al leer su comentario, tuve una duda, y luego escribí esto. Confirma que no estaba equivocado: \t public static void Main() \t { \t \t int cpt = 0; \t \t \t \t Console.WriteLine (cpt ++.Encadenar()); \t \t \t \t cpt = 0; \t \t \t \t Console.WriteLine ((++ cpt) .ToString()); \t \t Console.ReadLine(); \t} – Seb

+0

Hm ... Mi cerebro se ha retrasado ... No entendí que hablaste sobre el flujo de ejecución. Debería haber escrito "El método ToString() se ejecuta sobre el valor no incrementado" – Seb

17

Al menos cuatro de las respuestas publicadas hasta ahora son incorrectas. Es un error extremadamente común creer que el operador ++ tiene la misma semántica mal definida que en C. No es así. La semántica del operador ++ está bien definida y es bastante diferente de cómo se describieron aquí con las respuestas incorrectas. Véase mi respuesta a la última vez que se hizo esta pregunta para más detalles:

What is the difference between i++ and ++i?

+0

Gracias por las aclaraciones, Eric. – code4life

+0

+1, muy perspicaz, como de costumbre. Modifiqué mi respuesta para evitar la implicación de que esto tiene algo que ver con "pasa antes". – Heinzi