Pourquoi l'attribution par membre d'un tableau n'est prise en charge que dans les structures
Contrairement aux tableaux en général, les tableaux définis dans les structures bénéficient d'une affectation par membre. Bien qu'attribuer un tableau à un autre ne soit pas autorisé (__
num1 = num2;//), cela devient réalisable au sein des structs (
struct1 = struct2;//< ;/pre>__), comme indiqué ci-dessous :</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">int num1[3] = {1,2,3}; int num2[3]; num2 = num1; // "error: invalid array assignment" struct myStruct { int num[3]; }; struct myStruct struct1 = {{1,2,3}}; struct myStruct struct2; struct2 = struct1;
Historique et Justification philosophique
Cette disparité découle de l'évolution de C. Dans les premières itérations, les tableaux étaient essentiellement des pointeurs sans informations de taille. Cela a gêné leur affectation, car le compilateur ne disposait pas des données nécessaires. Néanmoins, les tableaux au sein des structures ont bénéficié d'un traitement exceptionnel, héritant de leurs informations de type et de taille de la structure englobante. En conséquence, ils pourraient être attribués par membre dans le contexte de la structure, sans être affectés par les contraintes générales.
Cette pratique a été reprise dans le C et le C modernes, une bizarrerie qui résout les défis de mise en œuvre liés à l'attribution de tableaux ouverts. L'introduction de l'affectation générale des tableaux aurait introduit des problèmes d'ambiguïté et de compatibilité. Ainsi, la limitation a été maintenue et les programmeurs ont été encouragés à utiliser memcpy pour la copie explicite de tableaux.
Exceptions
Les paramètres de fonction sont apparus comme un autre paramètre dans lequel les membres du tableau peuvent être attribué. Considérez le code suivant :
typedef int vec[3]; void f(vec a, vec b) { a = b; // pointer assignment }
Bien que a soit un paramètre de pointeur, l'affectation effectue effectivement une copie par élément, bien qu'elle soit en dehors d'une structure. Cette exception est essentiellement une amélioration qui permet la sémantique des valeurs dans les appels de fonction.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!