2011-09-05 12 views
9

Lo he visto en varios bucles e incrementos. En lugar de hacer i ++ lo hacen i + = 1. ¿Por qué es esto?¿Por qué la gente usa i = i + 1 en lugar de i ++?

+0

¿Por qué es su pregunta en el título diferente de la pregunta en el cuerpo? ¿A cuál te refieres? –

+0

Uso 'i + = 1', excepto en la 3ª posición de un for-loop, en cuyo caso uso' i ++ '. –

Respuesta

9

No todos los idiomas tienen ++ operador (python, por ejemplo) ... Probablemente estas personas provienen de un fondo en uno de esos idiomas. También algunas personas sienten que i++ no es muy claro, especialmente porque algunos idiomas tratan i++ y ++i de manera diferente.

+7

Cada idioma que conozco trata 'i ++' y '++ i' de manera diferente de una manera: el valor de la expresión.En otras palabras, 'x = i ++;' asigna un valor menos en uno a 'x' que' 'x = ++ i'. ¿Eso es lo que tenías en mente? Tengo curiosidad acerca de su uso de la palabra "algunos"; ¿Conoces idiomas que tienen operadores de incremento de prefijo y postfix y no hacen esta distinción? –

+1

@Ted Hopp Perl devolverá un * valor * o una * referencia * según un incremento previo o posterior. Esto puede llevar a un comportamiento desconcertante. En la forma básica, esto no es un problema. Sin embargo, esto es muy desconcertante en los casos de 'foo ($ x, ++ $ x)', (la evaluación todavía ocurre de izquierda a derecha). Además, C/C++ tiene una gran cantidad de UB con modificaciones variables (++/-) y acceso entre dos puntos de secuencia. –

+1

En javascript para el navegador IE10 (y probablemente <10 también) i ++ es 15% * más lento * que i + = 1. Por lo tanto, siempre prefiero usar i + = 1, simplemente porque es más rápido y, desde el punto de vista semántico, es prácticamente el mismo derecho. – Yeti

14

Preferencia personal y estilo.

3

Previene el exceso de astucia. Al menos eso es lo que dice Crockford.

+2

Sin embargo, el código astuto será astuto sin "++" y el código limpio será código limpio con "++". –

2

i = i + 1 es más fácil de decodificar en inglés. i++ aunque totalmente correcto no se traduce bien cuando los principiantes están leyendo el código. El programador posiblemente intentaba hacer que su código fuera más legible para los principiantes, o tal vez simplemente no intentaba preocuparse demasiado por la sintaxis. No hay buena razón para usar una sobre la otra.

0

Algunas personas encuentran i = i + 1 o i += 1 más descriptivo que i++. Solo se trata de codificar el estilo y la legibilidad. En la mayoría de los idiomas actuales no hay diferencia de rendimiento entre las diferentes formas.

Hay algunos problemas de legibilidad con los operadores ++ y --, pero eso es principalmente cuando se usan junto con otros operadores, no es realmente un problema cuando se usan por sí mismos. Una expresión como ++x+-++y+-z++, por ejemplo, es perfectamente válida, pero es difícil ver lo que realmente hace. Como los operadores causan problemas de legibilidad en algunos casos, algunos sienten que siempre deben evitarse.

+0

Esto es un extremo, sin embargo. Si bien prefiero '+ =' a '++', el código bueno es bueno y el malo es el código incorrecto: '++ x + - ++ y + -z ++' no es un buen código, '++ 'a un lado. Por ejemplo, imagine si la "regla" para usar 'i ++' (o incluso '++ i') es" solo en un contexto de declaración ". Esto no es diferente de las "reglas" que restringen el uso de 'x = i = i + 1' u otras monstruosidades similares. –

+0

@pst: Por supuesto, es un código incorrecto, el punto con el ejemplo fue demostrar que los operadores pueden usarse para escribir código ilegible. – Guffa

3

La razón general es que hay dos versiones diferentes de la subasta que se comportan de manera diferente

var i = 0; 
1 == ++i // true 

y

var i = 0; 
1 == i++; // false 

++i se traduce en "incremento i, luego evaluar", mientras que i++ se traduce en "evalúe i, luego incremente"

Cuando escribe estas expresiones como i = i + 1;, queda claro cuál era la intención del programador y es más fácil encontrar errores en el código. Es la misma razón por la que la gente escribe "cláusulas yoda" como

if(6 == x){ 
    //. . . 
} 

porque si accidentalmente hace

if(6 = x){ 
    //. . . 
} 

que es más fácil coger el error

Cuestiones relacionadas