c++ arrays pointers unary-operator decay

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