c++ - ¿Qué hace “int*p=+ s;”?
arrays pointers (5)
Vi un tipo de programa extraño here .
int main()
{
int s[]={3,6,9,12,18};
int* p=+s;
}
El programa anterior se probó en los compiladores de GCC y Clang y funciona bien en ambos compiladores.
Tengo curiosidad por saber qué hace
int* p=+s;
¿hacer?
¿La matriz
s
decayada al tipo de puntero?
¿La matriz
s
decayada al tipo de puntero?
Sí.
¿Qué hace
int* p=+s;
¿hacer?
El operador Unary
+
obliga a la matriz a descomponerse en un puntero.
Estándar de C ++, 5.3.1 Operadores Unarios (P7):
El operando del operador unario + tendrá aritmética, enumeración sin ámbito o tipo de puntero y el resultado es el valor del argumento. La promoción integral se realiza en operandos integrales o de enumeración. El tipo del resultado es el tipo del operando promovido.
La forma
+
unaria
(+s)
obliga a que el operando se evalúe como un número o un puntero.
Para obtener más información, consulte esta respuesta de desbordamiento de pila .
Aquí, unary + solo está haciendo * p para señalar las direcciones de la matriz Integer. Tomemos dos matrices s1 y s2
int s1[]={1,5,2};
int s2[]={2,5,2};
int *p=+s1;
p=+s2;
printf("%d",(int)p[0]);
Salida: 2
Así que en mi punto de vista, unary + solo está haciendo el puntero p para indicar la dirección de inicio de la matriz.
El
operator+
incorporado
operator+
podría tomar el tipo de puntero como su operando, por lo que pasarle la matriz a causa la
conversión de matriz a puntero
y luego se devuelve el puntero
int*
.
Eso significa que podrías usar
+s
individualmente para obtener el puntero.
(Para este caso es superfluo; sin
operator+
también decaerá al puntero y luego se asignará a
p
.)
(énfasis mío)
El operador unario plus incorporado devuelve el valor de su operando. La única situación en la que no es un no-op es cuando el operando tiene un tipo integral o un tipo de enumeración sin ámbito, que se modifica mediante la promoción integral, por ejemplo, convierte char a int o si el operando está sujeto a lvalue-to-rvalue, matriz a puntero , o función a puntero de conversión.
Ese es un símbolo unario que no tiene ningún efecto práctico aquí. Por ejemplo:
#include <iostream>
int main() {
int a[] = {1};
std::cout << a << " " << +a << std::endl;
}
Esto imprime la misma dirección para
a
y
+a
.
La matriz se decae para apuntar como de costumbre.
Tenga en cuenta que, si hubiera sido un menos
-a
unario en su lugar, entonces GCC mostraría el error:
error: wrong type argument to unary minus
Edición: Aunque no tiene efecto en el código de OP,
a
y
+a
no son exactamente iguales.
Consulte las respuestas de Khurshid Normuradov y songyuanyao para obtener más información.
Prueba esto:
#include <stdio.h>
int main(){
char s[] = { ''h'', ''e'', ''l'', ''l'', ''o'' , '' '', ''w'', ''o'', ''r'', ''l'', ''d'', ''!''} ;
printf("sizeof(s) : %zu, sizeof(+s) : %zu/n", sizeof(s), sizeof(+s) ) ;
}
En mi PC (Ubuntu x86-64) se imprime:
sizeof(s): 12, sizeof(+s) : 8
dónde
12 = number of elements s times size of char, or size of whole array
8 = size of pointer