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 .