Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

trigraphe dans test conditionnel !

19 réponses
Avatar
jmm
Je viens de parcourir un morceau de code qui contient ce genre
d'instruction :

if( dots == 0 ? len > 8 : len > 3 ) ...

Supprenant non ?
Quand pensez-vous ( performance, maintenabilité, ...) ?

10 réponses

1 2
Avatar
Samuel DEVULDER
jmm a écrit :
Je viens de parcourir un morceau de code qui contient ce genre
d'instruction :

if( dots == 0 ? len > 8 : len > 3 ) ...

Supprenant non ?
Quand pensez-vous ( performance, maintenabilité, ...) ?



Est-ce plus lisible que

((dots == 0) && (len > 8)) || ((dots != 0) && (len > 3))

? J'ai l'impression que non. L'aspect "ou exclusif" du "ou" dans cette
formule ne saute pas aux yeux.

A noter qu'il y aurait pu avoir

if(len > (dots == 0 ? 8 : 3))

Qui est encore plus compact que la formule initiale, mais qui ne me
plait mois car on ne lit pas directement ce qu'on veut faire. En effet,
il faut un peu plus décoder et réfléchir pour comprendre ce que ce test
réalise.

sam.
Avatar
-ed-
On 18 juin, 08:34, jmm wrote:
Je viens de parcourir un morceau de code qui contient ce genre
d'instruction :

if( dots == 0 ? len > 8 : len > 3 ) ...

Supprenant non ?
Quand pensez-vous ( performance, maintenabilité, ...) ?



Le terme 'trigraph' ne s'applique pas à ce code. On parle plutôt
d'opérateur ternaire.

Le langage C offre des possibilité de syntaxe 'astucieuses', qui
facilitent la traduction du source en du binaire efficace, mais ne
facilitent pas toujours la lecture. C'est une question d'habitude,
mais justement, si on est pas habitué, ça peut donner des boutons ...

Je pense que les compilateurs modernes n'ont plus besoins de cette
aide du 'compilateur humain', car ils sont suffisamment performants
pour produire du code efficace, même si le source est écrit de manièr e
lisible par tous ! Mais sur une plateforme exotique ou ancienne, on
peut parfois tomber sur de vielles carnes qu'il faut "aider à la
main" ...
Avatar
espie
In article ,
jmm wrote:
Je viens de parcourir un morceau de code qui contient ce genre
d'instruction :

if( dots == 0 ? len > 8 : len > 3 ) ...

Supprenant non ?
Quand pensez-vous ( performance, maintenabilité, ...) ?


Qu'en...

C'est du C idiomatique. Ca se lit tres bien si on connait le langage.
Ca n'est ni bien, ni mal. En l'absence du contexte environnant, je n'ai
aucune idee si j'ecrirais ce genre de chose comme ca, ou s'il y a moyen
de faire plus clair/plus joli/mieux...

Ah, et cote expression francaise, evite aussi de confondre trigraphe et
operateur ternaire, ca fait desordre...
Avatar
Marc Boyer
Le 18-06-2010, jmm a écrit :
Je viens de parcourir un morceau de code qui contient ce genre
d'instruction :

if( dots == 0 ? len > 8 : len > 3 ) ...



On ne parlera pas de trigraphe: un trigraph, c'est une séquence
de trois caractères qui est équivalente à un seul (en général)
caractères peut accessible sur certains claviers.

Un peu de google ou de wikipedia te donnera plus d'infos.

Supprenant non ?
Quand pensez-vous ( performance, maintenabilité, ...) ?



En terme de performances, je n'en pense rien.
Après, en terme de lisibilité, il parait clair que l'optique
des if imbriqués est pire.
Reste des choses du type
if ( (dots == 0 && len > 8 )
|| (dots != 0 && len > 3 ) )...
ou
int bound= (dots == 0 ? 8 : 3 );
if (len > bound) ...

Voilà. A titre personnel, je trouve la version originale
plutôt pas mal. Mais peut-être que l'opérateur ?: va dérouter
des programmeurs moins habitués.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Avatar
Antoine Leca
Samuel DEVULDER écrivit :
jmm a écrit :
Je viens de parcourir un morceau de code qui contient ce genre
d'instruction :

if( dots == 0 ? len > 8 : len > 3 ) ...

Supprenant non ?





Non. C'est du C correct, et tu peux être sûr que ce code n'a pas été
traduit du basic...


Quand pensez-vous ( performance, maintenabilité, ...) ?



Est-ce plus lisible que

((dots == 0) && (len > 8)) || ((dots != 0) && (len > 3))



Attention : ta formule à toi est différente. En particulier, elle évalue
dots deux fois, ce qui n'est pas le cas de celle de jmm.
Remplace dots par getchar() ou *p++ et on voit bien le problème...


A noter qu'il y aurait pu avoir

if(len > (dots == 0 ? 8 : 3))

Qui est encore plus compact que la formule initiale, mais qui ne me
plait mois car on ne lit pas directement ce qu'on veut faire.



C'est bizarre, moi je trouve cette dernière plus facile à lire.
Comme quoi tous les avis sont possibles en matière de style.


Antoine
Avatar
Alexandre Bacquart
On 06/18/2010 08:34 AM, jmm wrote:
Je viens de parcourir un morceau de code qui contient ce genre
d'instruction :

if( dots == 0 ? len> 8 : len> 3 ) ...

Supprenant non ?



Bof.

Quand pensez-vous ( performance, maintenabilité, ...) ?



J'aurais plutôt écrit :

if (len > (dots ? 3 : 8)) ...

Mais bon.

Maintenance : en grande partie dépendant de la lisibilité, et c'est
selon le lecteur. Mais pour moi, c'est toujours mieux (pour la
maintenance) d'éviter de répéter un nom de variable quand on peut
l'utiliser qu'une seule fois. D'autres trouveront plus lisible
d'introduire une autre variable, ou des if imbriqués. Ca dépend aussi
pas mal de ce qu'il y a autour en fait.

Performance : kif-kif. Quelle que soit la méthode utilisée, un compilo
correct devrait générer le même code pour une logique aussi simple.


--
Alex
Avatar
Antoine Leca
if( dots == 0 ? len > 8 : len > 3 ) ...

Quand pensez-vous ( performance, maintenabilité, ...) ?



Que c'est plus lisible que
if( len > (dots==0)*5+3 ) ...


Antoine
Avatar
Wykaaa
Marc Boyer a écrit :
Le 18-06-2010, jmm a écrit :
Je viens de parcourir un morceau de code qui contient ce genre
d'instruction :

if( dots == 0 ? len > 8 : len > 3 ) ...



On ne parlera pas de trigraphe: un trigraph, c'est une séquence
de trois caractères qui est équivalente à un seul (en général)
caractères peut accessible sur certains claviers.

Un peu de google ou de wikipedia te donnera plus d'infos.

Supprenant non ?
Quand pensez-vous ( performance, maintenabilité, ...) ?



En terme de performances, je n'en pense rien.
Après, en terme de lisibilité, il parait clair que l'optique
des if imbriqués est pire.
Reste des choses du type
if ( (dots == 0 && len > 8 )
|| (dots != 0 && len > 3 ) )...
ou
int bound= (dots == 0 ? 8 : 3 );
if (len > bound) ...

Voilà. A titre personnel, je trouve la version originale
plutôt pas mal. Mais peut-être que l'opérateur ?: va dérouter
des programmeurs moins habitués.

Marc Boyer



Ah oui, pourquoi ?
Disons qu'il serait surprenant qu'un bon programmeur C soit surpris par
ce code ;-)
Quant aux autres, il vaudrait mieux qu'ils codent dans un autres
langage, peut-être...
Avatar
Pierre Maurette
Antoine Leca, le 18/06/2010 a écrit :
if( dots == 0 ? len > 8 : len > 3 ) ...

Quand pensez-vous ( performance, maintenabilité, ...) ?



Que c'est plus lisible que
if( len > (dots==0)*5+3 ) ...



Je lis assez bien:

if(len > 3 + 5*(dots == 0)) ...

J'utilise assez couramment ce genre de truc en interprêté et quand je
me fiche de la performance. C'est à dire 99,99...% des cas.
Maintenant imaginons que ce test soit dans un boucle stratégique.
Avantage, on évite un branchement. Faudrait s'occuper du /if/, mais ce
n'est pas ici le problème.
Le compilateur ne va pas générer une multiplication, très coûteuse.
Mais certainement une multiplication par une constante, c'est à dire
une paire d'instructions peu coûteuses. Comme on dit à la pétanque, je
pense que selon le contexte, ça se mesure...

--
Pierre Maurette
Avatar
Antoine Leca
Pierre Maurette a écrit :
if(len > 3 + 5*(dots == 0)) ...

Maintenant imaginons que ce test soit dans un boucle stratégique.
Avantage, on évite un branchement.



Mouais. Pas sûr. Soit ton compilo est pipô, et il va te coller quand
même le branchement caché dans l'opérateur == utilisé dans un contexte
entier, parce qu'en fait il faut lire cet opérateur comme
(dots==0 ? 1 : 0)

Soit il est performant, et il va « supprimer » aussi bien le branchement
inhérent à l'opérateur ?: que celui de l'opérateur == utilisé comme entier.


Et si tu me dis qu'il est compliqué d'optimiser en général l'opérateur
?: pour éviter les sauts, je suis d'accord avec toi, il y a plus de
chances que le compilateur passe du temps à simplifier le if()...
et au passage, il va probablement représenter l'expression complète de
la même manière que l'on utilise ?: ou 5*(==0), donc au final il n'y a
aucune différence, et il vaut mieux prendre l'écriture la plus lisible
(et oui, je suis conscient qu'ici, c'est Charybde et Scylla.)


Antoine
1 2