GNT sans publicité, site mobile, fonctionnalitées exclusives...

evaluation avec "? "...un vestige de C ? ex: b1 ? "..." : "...."

Le
heinquoi
bjr,

j'ai dans un exemple un programme qui contient la ligne :
cout << endl << "le nombre 11 etait " << (b2 ? "TROUVE" : "NON TROUVE") <<
endl;

je intéresse surtout à (b2 ? "TROUVE" : "NON TROUVE")
est ce que opérateur évaluation "?" est un vestige de C ?

si je remplace ce morceau par
( if b2 "TROUVE" else "NON TROUVE") cela ne fonctionne pas, pourtant il
s'agit d'evaluation sur b2
hormis le fait que cette écriture lorsqu'elle est fréquente est obscure et
limite 'incantatoire' qu'elle est sont intérêt et pourquoi fonctionne t elle
ou un if ne fonctionne pas?
--
Cordialement,
Heinquoi
Lire les 23 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 5
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Arnaud Debaene
Le #767615
heinquoi wrote:
bjr,

j'ai dans un exemple un programme qui contient la ligne :
cout << endl << "le nombre 11 etait " << (b2 ? "TROUVE" : "NON
TROUVE") << endl;

je intéresse surtout à (b2 ? "TROUVE" : "NON TROUVE")
est ce que opérateur évaluation "?" est un vestige de C ?
Un"vestige" non, mais ca fait effectivement partie du C, et donc aussi du

C++ par compatibilité.

La sémantique est :
test ? <expression_si_vrai> : <expression_si_faux>


si je remplace ce morceau par
( if b2 "TROUVE" else "NON TROUVE") cela ne fonctionne pas, pourtant
il s'agit d'evaluation sur b2
if (b2)

cout<<"TROUVE";
else
cout<<"NON TROUVE";

hormis le fait que cette écriture lorsqu'elle est fréquente est
obscure et limite 'incantatoire' qu'elle est sont intérêt et pourquoi
fonctionne t elle ou un if ne fonctionne pas?
Elle a a la fois l'avantage et le défaut d'être compact, ce qui selon les

gens (et les cas!) soit alourdit soit rend plus clair le code.

La différence sémantique avec un if est que l'expression ( ... ? ... : ...)
"renvoie" (le terme exact est "est évaluée comme") une valeur de type const
char* qui peut ête envoyé directement dans le flux. Par contre, l'expression
if ne "renvoie" rien en elle même.
Ton exemple est un cas ou je trouve, personnellement, que l'écriture "... ?
... : ..." est plus claire, mais c'est hautement discutable.

Arnaud

Jean-Noël Mégoz
Le #767385
"heinquoi" news:40d9e65e$0$15203$
bjr,

j'ai dans un exemple un programme qui contient la ligne :
cout << endl << "le nombre 11 etait " << (b2 ? "TROUVE" : "NON TROUVE")
<<

endl;

je intéresse surtout à (b2 ? "TROUVE" : "NON TROUVE")
est ce que opérateur évaluation "?" est un vestige de C ?

si je remplace ce morceau par
( if b2 "TROUVE" else "NON TROUVE") cela ne fonctionne pas, pourtant il


( if b2 "TROUVE" else "NON TROUVE") ne peut fonctionner car, d'une part, il
manque des parenthèses autour de b2, mais surtout, "TROUVE" et "NON TROUVE"
ne sont pas des *instructions* mais des *expressions* que le "?" renvoie ou
non selon le réultat du test...
L'opérateur "?" est peut être parfois dur à lire, quand les opérandes sont
longs par exemple... Mais pour ma part, c'est une écriture que j'aime
particulièrement et que je n'ai jamais eu de mal à lire. On le retouve
d'ailleurs dans d'autres langages (Prolog, notamment).

Quant à savoir si c'est un vestige du C ou si c'est du C++ pur jus, je
laisse les spécialistes de ce NG se prononcer !

James Kanze
Le #767383
"heinquoi"
|> j'ai dans un exemple un programme qui contient la ligne :
|> cout << endl << "le nombre 11 etait " << (b2 ? "TROUVE" : "NON TROUVE") <<
|> endl;

|> je intéresse surtout à (b2 ? "TROUVE" : "NON TROUVE")
|> est ce que opérateur évaluation "?" est un vestige de C ?

Dans le même sens que l'opérateur de '+' est un vestige de C ?

|> si je remplace ce morceau par
|> ( if b2 "TROUVE" else "NON TROUVE") cela ne fonctionne pas, pourtant il
|> s'agit d'evaluation sur b2
|> hormis le fait que cette écriture lorsqu'elle est fréquente est
|> obscure et limite 'incantatoire' qu'elle est sont intérêt et
|> pourquoi fonctionne t elle ou un if ne fonctionne pas?

Parce qu'un if, c'est une instruction de contrôle de flux, et ?:, c'est
un opérateur. On aurait pu imaginer qu'le même syntaxe sert dans les
deux cas, mais ce n'est pas le cas en C ni en C++ (ni en Java, ni en
Objective C, ni en ...).

Je ne sais pas en ce qui concerne les autres, mais je m'en sers assez
librement. Si l'idée importante derrière un bout de code, c'est que la
valeur x soit affectée, et non qu'on a une condition, je le trouve plus
claire d'écrire :

x = ( condition
? a
: b ) ;

que :

if ( condition ) {
x = a ;
} else {
x = b ;
}

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
heinquoi
Le #767380
"Arnaud Debaene" news:40d9f54d$0$29373$
La sémantique est :
test ? <expression_si_vrai> : <expression_si_faux>


d'apres ton posts j'ai cru comprendre que ?: contrairement à if else avait
une valeur de retour "est évaluée comme".
ce qui pourrait faire
<type_expression> test ? <expression_si_vrai> : <expression_si_faux>
^^^^^^^^^^^^^^
valeur de 'retour'

Cela semble impliquer que <expression_si_vrai> et <expression_si_faux> soit
de meme type. Est ce tjrs le cas ?
ex: cout cout

Elle a a la fois l'avantage et le défaut d'être compact, ce qui selon les
gens (et les cas!) soit alourdit soit rend plus clair le code.

La différence sémantique avec un if est que l'expression ( ... ? ... :
...)

"renvoie" (le terme exact est "est évaluée comme") une valeur de type
const

char* qui peut ête envoyé directement dans le flux. Par contre,
l'expression

if ne "renvoie" rien en elle même.


Le type renvoyé est -il tjrs char* ( cf question precedente) ?

Ton exemple est un cas ou je trouve, personnellement, que l'écriture "...
?

... : ..." est plus claire, mais c'est hautement discutable.


d'accord avec toi, lorsque l'on en connaît le sens.

--
Cordialement,
Heinquoi

Nicolas Vervelle
Le #767153
"heinquoi"

Cela semble impliquer que <expression_si_vrai> et <expression_si_faux>
soit

de meme type. Est ce tjrs le cas ?
ex: cout cout

Elle a a la fois l'avantage et le défaut d'être compact, ce qui selon
les


gens (et les cas!) soit alourdit soit rend plus clair le code.

La différence sémantique avec un if est que l'expression ( ... ? ... :
...)

"renvoie" (le terme exact est "est évaluée comme") une valeur de type
const

char* qui peut ête envoyé directement dans le flux. Par contre,
l'expression

if ne "renvoie" rien en elle même.


Le type renvoyé est -il tjrs char* ( cf question precedente) ?



Le type renvoyé est le type de <expression_si_faux> doit être du même type qui <expression_si_vrai> (ou au
moins castable par le compilo)

Dans ton exemple, le résultat est "cout si faux

Nico


Publicité
Suivre les réponses
Poster une réponse
Anonyme