vectores punteros practica operadores matrices lenguaje funciones direccion con aritmetica apuntadores c

punteros - ¿Cuál es el propósito del operador unario ''+'' en C?



punteros y matrices en c (8)

¿Cuál es el propósito del operador unario ''+'' en C?

Unario plus se agregó a C para la simetría con menos unario, de la Justificación para los lenguajes de programación estándar internacional-C :

Unary plus fue adoptado por el Comité C89 de varias implementaciones, por simetría con menos unario.

y no es un no-op, realiza las promociones enteras en su operando. Citando mi respuesta al operador Does Unary +, ¿escribes conversiones? :

El borrador de la sección estándar C99 6.5.3.3 operadores aritméticos unarios dice:

El resultado del operador unario + es el valor de su operando (promovido). Las promociones enteras se realizan en el operando y el resultado tiene el tipo promocionado.

Vale la pena señalar que el Manual de referencia anotado de C ++ ( ARM ) proporciona el siguiente comentario sobre plus unario:

Unario plus es un accidente histórico y generalmente inútil.

En C, es legal escribir algo como:

int foo = +4;

Sin embargo, por lo que puedo decir, el unario + en +4 es un no-op. ¿Lo es?


No es precisamente un no-op

El operador unario + solo hace una cosa: aplica las promociones enteras . Como eso ocurriría de todos modos si el operando se usara en una expresión, uno imagina que unario + está en C simplemente para simetría con unario - .

Es difícil ver esto en acción porque las promociones se aplican tan generalmente.

Se me ocurrió esto:

printf("%zd/n", sizeof( (char) ''x'')); printf("%zd/n", sizeof(+(char) ''x''));

que (en mi Mac) imprime

1 4


Bastante. Está principalmente presente para ser completo y hacer que las construcciones como esta parezcan un poco más limpias:

int arr[] = { +4, -1, +1, -4, };


Encontré dos cosas que el operador unario + hace

  • integer promotion
  • turning lvalue into rvalue

Ejemplo de promoción entera:

#include <stdio.h> int main(void) { char ch; short sh; int i; long l; printf("%d %d %d %d/n",sizeof(ch),sizeof(sh),sizeof(i),sizeof(l)); printf("%d %d %d %d/n",sizeof(+ch),sizeof(+sh),sizeof(+i),sizeof(+l)); return 0; }

Salida típica (en la plataforma de 64 bits):

1 2 4 8 4 4 4 8

convirtiendo lvalue en el ejemplo rvalue:

int i=0,j; j=(+i)++; // error lvalue required


Hay un uso muy útil del operador unario plus que conozco: en macros. Supongamos que quieres hacer algo como

#if FOO > 0

Si FOO no está definido, el lenguaje C requiere que sea reemplazado por 0 en este caso. Pero si FOO se definió con una definición vacía, la directiva anterior dará como resultado un error. En cambio, puedes usar:

#if FOO+0 > 0

Y ahora, la directiva será sintácticamente correcta independientemente de si FOO no está definido, definido como vacío o definido como un valor entero.

Por supuesto, si esto producirá la semántica deseada es una pregunta completamente separada, pero en algunos casos útiles sí lo hará.

Editar: tenga en cuenta que incluso puede usar esto para distinguir los casos de FOO se define como cero versus definido como en blanco, como en:

#if 2*FOO+1 == 1 /* FOO is 0 */ #else /* FOO is blank */ #endif


Por ''no-op'', ¿te refieres a la instrucción de montaje?
Si es así, entonces definitivamente no.

+4 es solo 4 : el compilador no agregará más instrucciones.


Puede usarlo como una especie de afirmación de que una expresión tiene un tipo aritmético:

#define CHECK_ARITHMETIC(x) (+(x))

Esto generará un error en tiempo de compilación si x evalúa (digamos) un puntero.

Ese es el único uso práctico que se me ocurre.


Según el estándar C90 en 6.3.3.3:

El resultado del operador unario + es el valor de su operando . La promoción integral se realiza en el operando. y el resultado tiene el tipo promocionado.

y

El operando del operador unario + o - tendrá un tipo aritmético .