J'ai vu un type de programme étrange ici .
int main()
{
int s[]={3,6,9,12,18};
int* p=+s;
}
Programme ci-dessus testé sur [~ # ~] gcc [~ # ~] et Clang compilateurs et fonctionne bien sur les deux compilateurs.
Je suis curieux de savoir, qu'est-ce que int* p=+s;
faire?
Le tableau s
est-il décomposé en type de pointeur?
Intégré operator+
peut prendre le type de pointeur comme opérande. Par conséquent, si vous passez le tableau s
, cela provoque conversion de tableau à pointeur , puis le pointeur int*
est retourné. Cela signifie que vous pourriez utiliser +s
individuellement pour obtenir le pointeur. (Dans ce cas, c'est superflu; sans operator+
il va aussi se désintégrer en pointeur puis assigné à p
.)
(c'est moi qui souligne)
L'opérateur unaire plus intégré renvoie la valeur de son opérande. La seule situation dans laquelle il ne s'agit pas d'un no-op est celle où l'opérande a un type d'énumération intégral ou non délimité, qui est modifié par promotion intégrale, par exemple, il convertit char en int ou si l'opérande est soumis à lvalue-to -valeur, conversion de tableau en pointeur ou de fonction en pointeur.
Testez ceci:
#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) ) ;
}
Sur mon PC (Ubuntu x86-64), il imprime:
sizeof(s): 12, sizeof(+s) : 8
où
12 = number of elements s times size of char, or size of whole array
8 = size of pointer
C'est un symbole unaire plus qui n'a pas d'effet pratique ici. Par exemple:
#include <iostream>
int main() {
int a[] = {1};
std::cout << a << " " << +a << std::endl;
}
Ceci affiche la même adresse pour a
et +a
. Le tableau est décomposé en pointeur comme d'habitude.
Notez que, s'il s'agissait d'un moins unaire -a
à la place, alors GCC afficherait l’erreur:
error: wrong type argument to unary minus
Edit: Bien que cela n'ait aucun effet dans le code de l'OP, a
et +a
ne sont pas exactement les mêmes. Veuillez vous reporter aux réponses de Khurshid Normuradov et songyuanyao pour plus de détails.
Le tableau
s
est-il décomposé en type de pointeur?
Oui.
Qu'est-ce que
int* p=+s;
faire?
Unaire +
l'opérateur force le tableau à se décomposer en un pointeur.
Norme C++, 5.3.1 Opérateurs unaires (P7):
L'opérande de l'opérateur unaire + doit avoir une énumération arithmétique, sans étendue, ou un type de pointeur et le résultat correspond à la valeur de l'argument. La promotion intégrale est effectuée sur des opérandes intégraux ou d'énumération. Le type du résultat est le type de l'opérande promu.
Le unaire +
forme (+s)
oblige l'opérande à être évalué en tant que nombre ou pointeur.
Pour plus d'informations, veuillez consulter ceci réponse au débordement de pile .
Ici unaire + est en train de faire * p pour pointer les adresses du tableau Integer. Prenons deux tableaux s1 et s2
int s1[]={1,5,2};
int s2[]={2,5,2};
int *p=+s1;
p=+s2;
printf("%d",(int)p[0]);
Sortie: 2
Donc à mon point de vue, unary + se contente de faire pointer p pour indiquer l’adresse de début du tableau.