visual usados tipos studio programacion mas lenguajes lenguaje c# c post-increment pre-increment

c# - usados - visual basic



¿Por qué no puedo hacer++ i++ en lenguajes tipo C? (7)

Medio en broma medio serio : ¿por qué no puedo hacer ++i++ en lenguajes similares a C, específicamente en C #?

Espero que aumente el valor, use eso en mi expresión y luego aumente nuevamente.


Aunque la respuesta corta "no es un lvalor" es correcta , tal vez sea solo una pregunta. ¿Por qué no es un valor? O, como decimos en C #, una variable .

La razón es porque no puedes tener tu pastel y comerlo también . Trabajar lógicamente:

En primer lugar, el significado de un operador ++ en C #, ya sea postfix o prefijo, es "tomar el valor de esta variable, incrementar el valor, asignar el nuevo valor a la variable y producir un valor como resultado" . El valor producido como resultado es el valor original o el valor incrementado, según se trate de un postfijo o un prefijo. Pero de cualquier manera, usted produce un valor.

Segundo, el valor de una variable es siempre el contenido actual de esa variable . (Módulo ciertos escenarios de hilos extraños que nos llevarían lejos).

Espero que estén de acuerdo en que estas son reglas perfectamente sensibles.

Ahora debería quedar claro por qué el resultado de i ++ no puede ser una variable, pero en caso de que no lo sea, déjeme aclararlo:

Supongamos que i es 10. El significado de i ++ debería ser "obtener el valor de i - 10 - incrementarlo - 11 - almacenarlo - i ahora es 11 - y dar el valor original como el resultado - 10". Entonces, cuando dice imprimir (i ++) debería imprimir 10, y 11 debería almacenarse en i.

Ahora suponga que el significado de i ++ es devolver la variable , no el valor . Dices print (i ++) y que pasa? Obtendrá el valor de i - 10 - incrementarlo - 11 - almacenarlo - i ahora es 11 - y devolver la variable como resultado. ¿Cuál es el valor actual de la variable? 11! Que es exactamente lo que NO quieres imprimir.

En resumen, si i ++ devolviera una variable, ¡estaría haciendo exactamente lo contrario al significado pretendido del operador! Su propuesta es lógicamente inconsistente, por lo que ningún idioma lo hace de esa manera.


Creo que el operador de incremento (o decremento) necesita un lvalue para asignar. Sin embargo, ++ i no es un valor, es una expresión. Alguien mejor versado en compiladores podría aclarar si existe alguna razón técnica para esta restricción.


De la sección 7.5.9 de la especificación C # 3.0 :

El operando de una operación de incremento o decremento postfijo debe ser una expresión clasificada como una variable, un acceso de propiedad o un acceso de indexador. El resultado de la operación es un valor del mismo tipo que el operando. Si el operando de una operación de incremento o decremento postfijo es una propiedad o acceso de indexador, la propiedad o el indexador debe tener un acceso get y un set set. Si este no es el caso, se produce un error en tiempo de compilación.

Además, la expresión de incremento posterior ( i++ ) se evaluaría primero porque tiene una prioridad más alta que el operador de incremento previo ( ++i ).


Porque el resultado de i++ no es un lvalue.


Porque te preocupa que un próximo programador mantenga (o intente reescribir) tu código, mucho después de que te despidan por desafiar las convenciones populares.


Probé (++ i, i ++) como solución alternativa:

#include <stdio.h> int main(){ int i=0; printf(" i: %i/n", i ); printf(" (++i,i++): %i/n", (++i,i++) ); printf(" i: %i/n", i ); }

Resultado:

i: 0 (++i,i++): 1 i: 2


Respuesta corta: i++ no es un "lvalue", por lo que no puede ser el sujeto de una tarea.