True (vrai) est une constante et a, comme le dit sasuke, pour valeur 1. Pour s'en convaincre, il suffit de rajouter la ligne suivante dans un script pawn : printf ("true=%d", true); qui produira l'affichage true=1
False (faux) quand à lui, a pour valeur 0 (on peut faire la même chose que pour true).
La négation de l'un des deux (vrai ou faux) donne l'autre (!false=!0=true=1 et !true=!1=!2=!3=...=false=0).
On peut très facilement tester tout ceci avec des printfs dans le main d'un gamemode.
En C ou en PAWN, un test est TOUJOURS une comparaison d'une expression avec 0. Si l'expression vaut 0, le corps du test n'est pas effectué.
L'instruction if n'utilise pas true et false pour savoir si le code sera exécuté ou non, elle n'utilise que 0.
De ce fait, par abus de language, on considère que ce qui n'est pas égal à 0 (faux) est vrai (donc égal à 1).
Et quand je parle d'expression, je parle de la valeur finale de ce qui est contenu entre les parenthèses qui suivent le if.
Ex :
if (IsplayerAdmin(playerid) && Vid=GetPlayerVehicleID(playerid) && (score[playerid]==50 || score[playerid]==60))
{
printf ("L'expression à une valeur différente de 0");
}
Ce qui est en gras est l'expression qui sera évaluée au moment du test puis comparée à 0. Dans cet exemple, l'expression vaudra 0 ou 1 à cause de la présence des opérateurs &&.
Mais dans l'exemple suivant, l'expression peut prendre n'importe quelle valeur entre 0 et 10000 :
if (Alea=random(10001))
{
printf ("Le nombre choisi est %d", Alea);
}
else
{
printf ("Le nombre choisi est 0");
}
Mais comme je le disais précédemment, je déconseille fortement de mettre des affectations dans un test.
Un des risques d'une telle utilisation vient du fait que l'expression peut ne pas être évalué dans sa totalité.
Dans le test suivant, la variable Alea ne sera renseignée que si b vaut 7. Si b ne vaut pas 7, l'instruction Alea=random(10001) ne sera pas exécutée.
if (b==7 && Alea=random(10001))
Exemple concret :
new a=10005, b=2;
if (b==2 && (a=random(10001)))
printf ("b=%d, a=%d", b, a);
else
printf ("b=%d, a=%d", b, a);
a=10005;
if (b==3 && (a=random(10001)))
printf ("b=%d, a=%d", b, a);
else
printf ("b=%d, a=%d", b, a);
Ce bout de code produit l'affichage suivant :
b=2, a=1655
b=2, a=10005
NB : Ce qui est en gras peux varier car c'est un nombre aléatoire.
La valeur 10005 ne pouvant pas être obtenue avec random(10001) c'est que, dans le deuxième test, l'instruction a=random(10001) n'a pas été exécutée.
++
Syg