Difference between revisions of "If/fr"
m (At least let's not pollute English categories) |
m (Localized to French) |
||
Line 1: | Line 1: | ||
{{Multi-lang}} | {{Multi-lang}} | ||
{{#vardefine:p__desc| | {{#vardefine:p__desc| | ||
}}{{#vardefine:p_condition_desc| | }}{{#vardefine:p_condition_desc|Si cette condition est évaluée comme vraie alors '''branche''' est exécutée. | ||
}}{{#vardefine:p_condition_d_desc| | }}{{#vardefine:p_condition_d_desc|Si cette condition est évaluée comme vraie alors '''branche_vrai''' est exécutée, dans le cas contraire '''branche_faux''' est exécutée. | ||
}}{{#vardefine:p_branch_desc| | }}{{#vardefine:p_branch_desc|Peut être une instruction simple, un bloc d'instructions ou une instruction vide. | ||
}}{{LSL_Conditional/fr | }}{{LSL_Conditional/fr | ||
|statement=if | |statement=if | ||
|p1_name=condition | |p1_name=condition | ||
|p2_name= | |p2_name=branche | ||
|statement_header | |statement_header | ||
|statement_desc | |statement_desc | ||
|statement_title=if ( {{LSL Param|condition}} ) {{LSL Param| | |statement_title=if ( {{LSL Param|condition}} ) {{LSL Param|branche}} | ||
|extras= | |extras= | ||
{{!}} | {{!}} | ||
<div id="box"> | <div id="box"> | ||
== if ( {{LSL Param|condition_d|condition}} ) {{LSL Param|branch| | == if ( {{LSL Param|condition_d|condition}} ) {{LSL Param|branch|branche_vrai}} else {{LSL Param|branch|branche_faux}} == | ||
<div style="padding: 0.5em;"> | <div style="padding: 0.5em;"> | ||
{{{!}} | {{{!}} | ||
{{LSL DefineRow||condition|{{#var:p_condition_d_desc}}}} | {{LSL DefineRow||condition|{{#var:p_condition_d_desc}}}} | ||
{{LSL DefineRow|| | {{LSL DefineRow||branche_vrai|{{#var:p_branch_desc}}}} | ||
{{LSL DefineRow|| | {{LSL DefineRow||branche_faux|{{#var:p_branch_desc}}}} | ||
{{!}}} | {{!}}} | ||
</div> | </div> | ||
</div> | </div> | ||
|spec= | |spec=L'évaluation des opérateurs en LSL n'est jamais court-circuitée. Ainsi : | ||
{{{!}} style="border-width: 0px;border-spacing: 0px;" | {{{!}} style="border-width: 0px;border-spacing: 0px;" | ||
{{!}} | {{!}} | ||
<pre> | <pre> | ||
// | // Une méthode simple pour vérifier que cette fonction a été appelée. | ||
integer test() { | integer test() { | ||
llOwnerSay(" | llOwnerSay("Fonction de test appelée !"); | ||
return TRUE; | return TRUE; | ||
Line 35: | Line 35: | ||
default { | default { | ||
touch_start(integer | touch_start(integer nombre_total) | ||
if (FALSE && test()) | { | ||
// | if (FALSE && test()) // Si cette expression est optimisée par court-circuit, test() ne doit jamais être appelée. | ||
{ | |||
// On n'arrive jamais ici. | |||
} | } | ||
} | } | ||
Line 43: | Line 45: | ||
</pre> | </pre> | ||
{{!}}} | {{!}}} | ||
Dans un language court-circuité, si le terme de gauche d'un ET logique (&&) vaut FALSE, le terme de droite n'est jamais testé. En effet, le test complet renverra toujours FALSE, quelle que soit la valeur du terme de droite. Comme LSL n'est pas court-circuité, les termes de gauche et de droite sont toujours testés à chaque fois. | |||
Le comportement d'une expression court-circuitée peut être simulée en LSL avec des '''if''' imbriqués : | |||
<pre> | <pre> | ||
default { | default { | ||
touch_start(integer | touch_start(integer nombre_total) | ||
if (FALSE) { | { | ||
if (test()) { | if (FALSE) | ||
// | { | ||
if (test()) | |||
{ | |||
// On n'arrive jamais ici. | |||
} | } | ||
} | } | ||
Line 57: | Line 62: | ||
} | } | ||
</pre> | </pre> | ||
|examples= | |examples=Instruction if en ligne simple : | ||
<pre> | <pre> | ||
if (a == 1) c = b; | if (a == 1) c = b; | ||
</pre> | </pre> | ||
Bloc d'instructions if simple : | |||
<pre> | <pre> | ||
if (a == 1) | if (a == 1) | ||
{ | { | ||
// | // On fait quelque chose ici. | ||
} | } | ||
</pre> | </pre> | ||
Bloc if/else complexe (une seule ligne de texte est dite dans cet exemple) | |||
<pre> | <pre> | ||
if (a == "Loren") { | if (a == "Loren") { | ||
llSay(0, "Lorem ipsum sic amet!"); | llSay(0, "Lorem ipsum sic amet!"); | ||
} else if (a == " | } else if (a == "Scie") { | ||
llSay(0, " | llSay(0, "Si six cent scies scient six cent cyprès, six cent six scies scient six cent six cyprès."); | ||
} else { | } else { | ||
llSay(0, " | llSay(0, "Charabia ou français ?"); | ||
} | } | ||
</pre> | </pre> | ||
Instruction if composée : | |||
<pre> | <pre> | ||
if (a == 1 && b == c) | if (a == 1 && b == c) | ||
{ | { | ||
// | // La suite ici. | ||
} | } | ||
</pre> | </pre> | ||
Instructions if imbriquées : | |||
<pre> | <pre> | ||
if (a == 1) | if (a == 1) | ||
Line 93: | Line 98: | ||
if (b == c) | if (b == c) | ||
{ | { | ||
// | // La suite ici. | ||
} | } | ||
} | } | ||
</pre> | </pre> | ||
Attention aux points-virgules mal placés. Ils peuvent provoquer des comportements étranges et ils ne se gêneront pas pour le faire. | |||
Par exemple, si vous placez un point-virgule entre une instruction if et un bloc de code, l'instruction if n'influencera plus l'exécution ou non du bloc de code. | |||
<pre> | <pre> | ||
Line 107: | Line 112: | ||
} | } | ||
</pre> | </pre> | ||
Ce code s'exécute dans l'ordre suivant : | |||
# | # La ligne <code>if (a == "Loren");</code> s'exécute ; le point-virgule indique à LSL qu'il s'agit d'une simple instruction if en ligne. | ||
# | # Ensuite il rencontre le début du bloc de code et il en exécute le contenu, quel qu'aie été le résultat de l'instruction if qui précède. | ||
Un autre problème est quand quelqu'un oublie d'utiliser les accolades : | |||
<pre> | <pre> | ||
if (a == "Loren") | if (a == "Loren") | ||
llSay(0, "Lorem ipsum sic amet!"); | llSay(0, "Lorem ipsum sic amet!"); | ||
llSay(0, " | llSay(0, "Je ne sais pas non plus ce que ça veut dire..."); | ||
</pre> | </pre> | ||
La source de l'erreur est que l'indentation donne l'impression que les deux commandes llSay sont contrôlées par l'instruction if, alors que seule la première l'est. En fait, si <code>a</code> était égal à "Truc", la seule chose qui serait dite serait "Je ne sais pas non plus ce que ça veut dire...". | |||
Revision as of 02:59, 8 January 2008
LSL Portail Francophone | LSL Portail Anglophone | Fonctions | Évènements | Types | Operateurs | Constantes | Contrôle d'exécution | Bibliothèque | Tutoriels |
if ( condition ) branche
| |||||||||||||||||
if ( condition ) branche_vrai else branche_faux
| |||||||||||||||||
Spécification
L'évaluation des opérateurs en LSL n'est jamais court-circuitée. Ainsi :
Dans un language court-circuité, si le terme de gauche d'un ET logique (&&) vaut FALSE, le terme de droite n'est jamais testé. En effet, le test complet renverra toujours FALSE, quelle que soit la valeur du terme de droite. Comme LSL n'est pas court-circuité, les termes de gauche et de droite sont toujours testés à chaque fois. Le comportement d'une expression court-circuitée peut être simulée en LSL avec des if imbriqués : default { touch_start(integer nombre_total) { if (FALSE) { if (test()) { // On n'arrive jamais ici. } } } } | |||||||||||||||||
ExemplesInstruction if en ligne simple : if (a == 1) c = b; Bloc d'instructions if simple : if (a == 1) { // On fait quelque chose ici. } Bloc if/else complexe (une seule ligne de texte est dite dans cet exemple) if (a == "Loren") { llSay(0, "Lorem ipsum sic amet!"); } else if (a == "Scie") { llSay(0, "Si six cent scies scient six cent cyprès, six cent six scies scient six cent six cyprès."); } else { llSay(0, "Charabia ou français ?"); } Instruction if composée : if (a == 1 && b == c) { // La suite ici. } Instructions if imbriquées : if (a == 1) { if (b == c) { // La suite ici. } } Attention aux points-virgules mal placés. Ils peuvent provoquer des comportements étranges et ils ne se gêneront pas pour le faire. Par exemple, si vous placez un point-virgule entre une instruction if et un bloc de code, l'instruction if n'influencera plus l'exécution ou non du bloc de code. if (a == "Loren"); { llSay(0, "Lorem ipsum sic amet!"); } Ce code s'exécute dans l'ordre suivant :
Un autre problème est quand quelqu'un oublie d'utiliser les accolades : if (a == "Loren") llSay(0, "Lorem ipsum sic amet!"); llSay(0, "Je ne sais pas non plus ce que ça veut dire..."); La source de l'erreur est que l'indentation donne l'impression que les deux commandes llSay sont contrôlées par l'instruction if, alors que seule la première l'est. En fait, si |
If