IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

C++17 crée une utilisation pratique de l'opérateur d'indexation de tableau rétrograde
Par Raymond Chen, Senior Software Engineer chez Microsoft

Le , par Raymond Chen

372PARTAGES

6  0 
Vous avez lu gratuitement 1 068 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de grunk
Modérateur https://www.developpez.com
Le 05/06/2023 à 17:35
Qu'en pensez-vous ?
Que c'est exactement ces trucs qui font que ca me manque pas du tout de plus faire de C++ dans mon nouveau job
4  0 
Avatar de foetus
Expert éminent sénior https://www.developpez.com
Le 07/06/2023 à 12:38
Citation Envoyé par jmv  Voir le message
Alors ça, je ne savais pas ! depuis quand ?

Effectivement c'est la question depuis quand ?

Mais je pense que c'est 1 peu 1 fausse question
C'est plus le compilateur qui convertit a[i] en *(a + i) … et donc c'est interchangeable *(i + a).
Après il faudrait 1 expert gcc/ LLVM pour me dire si j'ai tord
4  0 
Avatar de dalfab
Expert éminent https://www.developpez.com
Le 07/06/2023 à 19:30
L'équivalence a[i] === *(a+i) === i[a] est la base du C, existe donc depuis le début.
Il existe un petit écart en C++, le résultat de a[i] est une x-value au lieu d'une l-value si l'expression a n'est pas une l-value, donc a[i] n'est pas totalement équivalent à i[a].

Ce qui change c'est que désormais l'ordre d'exécution est garanti, du moins depuis le C++17, je ne sais pas pour le C.
Donc pour fct1()[ fct2() ], on sait quelle fonction est appelée en premier, c'est fct1(). Mais par exemple pour fct1() = fct2();, on commence par fct2(). Ça me parait complexe de se souvenir de ça!

De plus, cette "astuce" me parait doublement contreproductive en C++, pour 2 raisons:
- on ne devrait pas utiliser l'arithmétique des pointeurs en C++. Il est préférable d'utiliser les objets faits pour cela.
- si on veut une chronologie précise. Il est bien plus lisible et sûr de décomposer l'expression:
Code : Sélectionner tout
1
2
3
auto&&  x = fct1(); 
auto&&  y = fct2();  // ou dans l'ordre inverse 
auto  z = x[ y ];
Les analyseurs de code doivent systématiquement tagger une ligne auto z = fct(1)[ fct2() ] comme étant dangereuse.
3  0 
Avatar de Bousk
Rédacteur/Modérateur https://www.developpez.com
Le 06/06/2023 à 21:33
Citation Envoyé par Raymond Chen Voir le message

Et vous ?

Qu'en pensez-vous ?
Gadget, et je vois pas comment quiconque de sencé pourrait écrire un tel code ou le laisser passer en revue.
2  0 
Avatar de d_d_v
Membre expérimenté https://www.developpez.com
Le 06/06/2023 à 15:51
Je ne suis pas sûr de bien comprendre.

Code : Sélectionner tout
return index()[p];
Va être une écriture valide ? C'est pour faciliter la lisibilité du code, c'est ça ?

Sinon, les décideurs derrière la norme C++ ne pourraient pas faire des trucs utiles pour la vie de tous les jours, pour faciliter l'écriture et la lisibilité ?
2  1 
Avatar de jmv
Membre confirmé https://www.developpez.com
Le 07/06/2023 à 13:13
Effectivement, ça parait logique.
Donc la réponse à ma question initiale serait : depuis qu'il existe un compilateur C.
1  0 
Avatar de jmv
Membre confirmé https://www.developpez.com
Le 07/06/2023 à 12:27
Citation Envoyé par grunk  Voir le message
Que c'est exactement ces trucs qui font que ca me manque pas du tout de plus faire de C++ dans mon nouveau job

+1
Il est bien connu que si a est un pointeur ou un tableau et i un entier, alors a[i] et i[a] sont équivalents en C et C++

Alors ça, je ne savais pas ! depuis quand ?
0  0