Pregunta

En el siguiente código, ¿cuál es el beneficio de usar (!! p) en lugar de (p! = NULL) ?

AClass *p = getInstanceOfAClass();
if( !!p )
  // do something
else 
  // do something without having valid pointer
¿Fue útil?

Solución

Eso es una cuestión de estilo, de hecho son equivalentes. Consulte esta pregunta muy similar para discusión.

La comparación de IMO con el puntero nulo es más clara.

Otros consejos

Es más o menos lo mismo, aunque considero que !! p es un estilo malo, y generalmente indica que un codificador intenta ser inteligente.

Creo que el comentario original de GMan debería ser la respuesta aceptada:

  

Me pregunto qué está mal con solo if (p)

El punto es: nada está mal con eso, y debería ser la forma preferida. En primer lugar, !! p es "demasiado inteligente"; también es completamente innecesario y, por lo tanto, malo (aviso: estamos hablando de punteros en una declaración if aquí, por lo que el comentario de Anacrolix, aunque generalmente es válido, no se aplica aquí).

Lo mismo ocurre con p! = NULL . Si bien esto es posible, simplemente no es necesario. Es más código, es completamente redundante y, por lo tanto, empeora el código. Lo más verdadero que Jeff Atwood dijo alguna vez fue que "el mejor código no es ningún código". Evite la sintaxis redundante. Manténgase al mínimo (que aún transmite el significado completo; si (p) está completo).

Finalmente, if (p) es posiblemente la forma más idiomática de escribir esto en C ++. C ++ se desvía para obtener este mismo comportamiento para otros tipos en el lenguaje (por ejemplo, flujos de datos), a costa de algunas peculiaridades muy extrañas. La próxima versión del estándar incluso introduce una nueva sintaxis para lograr este comportamiento en tipos definidos por el usuario.

Para los punteros, obtenemos lo mismo de forma gratuita. Así que úsalo.

/ EDIT: Acerca de la claridad: sharptooth escribe que

  

La comparación de IMO con el puntero nulo es más clara.

Afirmo que esto es objetivamente incorrecto: si (p) es más claro. No hay forma posible de que esta declaración pueda significar otra cosa, ni en este contexto ni en ninguna otra, en C ++.

Por lo que puedo ver, es solo una forma más corta de convertirlo en un valor booleano. Aplica el! sin embargo, dos veces, mientras que p! = NULL hace una comparación. Así que supongo que el beneficio es un código más corto, aunque más críptico si no sabes qué significa !! p .

Son los mismos, pero recomiendo usar

NULL != p

Es más legible.

No hay diferencia en el ejemplo dado.

Sin embargo, la suposición de que esto se aplica a todos los casos es incorrecta. a = no no b no es lo mismo que a = b , en lo que respecta a los tipos de enteros.

En C, 0 es falso. Cualquier cosa menos 0 es verdadera. Pero no 0 es 1 , y nada más. En C ++, true se convierte a 1 como un entero, no solo por compatibilidad con C, sino porque 1 no es 0 , y 1 es el valor más común utilizado para denotar true en los tipos de Bools, incluido el tipo C bool oficial y BOOL utilizados en Win32.

Mientras que para el código de ejemplo dado, !! p no es necesario porque el resultado se convierte en un bool para evaluar la condición if , eso no descarta el uso de !! para propósitos de conversión de valores booleanos a valores enteros esperados. Personalmente, en este ejemplo, para maximizar la probabilidad de que los cambios de tipo y la semántica sean claros, usaría NULL! = P o p! = NULL para dejar absolutamente claro lo que es quiso decir.

Esta técnica se conoce como el lenguaje de doble explosión y que este tipo proporciona Algunas buenas justificaciones .

¡¡NO !! use doble negación. Un argumento simple es que, dado que C ++ es un subconjunto de inglés limitado y el inglés simplemente no tiene una doble negación, los hablantes de inglés tendrán muchas dificultades para analizar lo que está pasando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top