[Lenguaje C] = a + b y a = a + b realmente es exactamente equivalente a la misma? a [i] = i ++ en el extremo, ¿verdad?

▎a + b = y = a + b realmente es exactamente equivalente a la misma?

En el lenguaje C, creo que a + b = y = a + b que hemos escrito, que usted no ha pensado tanto en lo que no es exactamente equivalente a la misma?

De hecho, la dificultad de este problema en el tipo de datos de A y B, a dos casos:

1, para el mismo tipo de A, B para el

Los resultados de la aplicación de dos fórmulas realmente no hay diferencia. Pero desde el punto de vista del compilador, a + b =; cuando se realiza de manera eficiente.

2, para diferentes tipos de a, b para el

 Cuando dos tipos diferentes de variables durante la operación, a menudo nos dicen que el tipo de conversión. En este caso, por favor, tenga en cuenta que: durante el funcionamiento, el tipo de transición al modelo de gran precisión de baja precisión.

En el código anterior, si a + =, b se convierte directamente en char, si se utiliza a + b, a primera convertidos en int, el último asignado cuando se convierte a Char.

Así, en general, a = a + b; y a + b =; equivalencia no es cualquier momento, dependiendo de la situación se debe dividir, porque el tipo de datos se convierte aquí, queremos utilizar más adelante, tanto para la precaución.

 

▎a [i] = i ++ en el extremo, ¿verdad?

Programación a veces se encuentran algunas expresiones ambiguas, como a [i] = i ++. Así que a [i] = i ++ en el extremo derecho?

Consideremos en primer lugar el siguiente código:

Por esta expresión a [i] = i ++, subexpresión i ++ tiene un efecto secundario, que va a cambiar el valor de i, ya que i se hará referencia en la misma expresión, y por lo tanto esto dará lugar a un comportamiento indefinido . Desde esta referencia no puede ser determinada (el lado izquierdo de la ecuación a [i]) es el valor del valor nuevo o viejo.

Compiladores diferentes tienen diferentes interpretaciones entiende cuando tales actos, como los tres siguientes (compilador dev c ++, bloques de código, vs2019) a dicho código tiene diferentes interpretaciones.

operación de captura de pantalla se puede observar desde arriba en la misma pieza de código, y el resultado de ejecución dev c ++ bloques de código son los mismos, pero no son el mismo y vs2019.

Para este tipo de comportamiento, aunque algunos creen que el comportamiento en la literatura de tales expresiones es incierto, pero el estándar C tiene una fuerte declaración que no está definido.

Otros ejemplos de comportamiento indefinido incluyen acceso a una gama más allá de sus fronteras, de referencia de puntero nulo, después del final de la vida el acceso a un objeto o expresión escrita supuestamente inteligente como i ++ ++ + i.

un comportamiento indefinido hermano hay dos menos peligroso, un comportamiento indefinido y el comportamiento definido por la implementación.

Por lo tanto el comportamiento definido por la implementación, un comportamiento indefinido, la diferencia entre estos tres comportamiento no definido dónde se encuentra?

En primer lugar de todos estos tres casos representan el estándar del lenguaje C no requiere explícitamente el uso de una estructura específica o su programa de campo debe completar las cosas. Esta definición amplia del lenguaje C es tradicional, pero la forma en que esta disposición está bien pensado, este enfoque permite la definición de:

1, cierta configuración de selección puede generar código eficiente de acuerdo con el "hardware de manera completa."

2, haciendo caso omiso de una definición precisa difícil, y la estructura de límite puede ser un programa de buena escritura de ninguna utilidad práctica.

 

▎ para la definición de estos tres "estándar de comportamiento no definido con precisión" son los siguientes:

1, el comportamiento definido por la implementación

Ciertos aspectos del funcionamiento de la máquina y se describe en esta norma es definido por la implementación (por ejemplo, sizeof (int)). Estos constituyen los parámetros de la máquina abstracta. Cada realización incluye un archivo debería caracterizarse y comportamiento en estos aspectos.

2, un comportamiento indefinido

Y ciertos otros aspectos de la operación de la máquina abstracta se describe en esta norma internacional es desconocido (por ejemplo, el orden de parámetros de la función de evaluación). Siempre que sea posible caso, el lenguaje C estándar internacional define un conjunto de comportamiento permisible. Estos definen los aspectos no deterministas de la máquina abstracta.

3, un comportamiento indefinido

Cualquier cosa puede suceder, esta norma no tiene ningún requisito, procedimiento pueden fallar para compilar, error de ejecución (caída directa o generar resultados erróneos) o afortunadamente como programadores quieren.

Desde el compilador norma no hace ninguna requisitos, entonces el compilador puede hacer cualquier comportamiento posible. Soportar la idea no se define en el programa es un comportamiento indefinido extremadamente peligroso, incluso sin definir lo que piensa.

Si desea escribir código portable, entonces se necesitan las tres acciones anteriores de evitar. Por lo tanto, es preferible evitar un lenguaje [i] = i ++ C tal undefined escrito al escribir el código.

       Para los amantes de la programación, la! He comenzado a aprender un club de intercambio de programación basada en cero ( grupo ), un grupo de aprendizaje conjunto respondido con una pequeña pareja es muy importante, así como el aprendizaje de archivos de vídeo, que son principiantes de bienvenida y avanzada en pequeños amigos!

Publicados 520 artículos originales · ganado elogios 132 · Vistas a 80000 +

Supongo que te gusta

Origin blog.csdn.net/HUYA69/article/details/105291837
Recomendado
Clasificación