Opérateur ternaire à l'intérieur de printf
Après la lecture de cette j'ai commencé à penser que j'ai appris un butin d'environ printf()
. Soudain, j'ai trouvé l'extrait de code suivant à partir de cette livre:
int main()
{
char str[]="Hello";
int i=5,j=10;
printf(i>j?"%50s":"%s",str); //unable to understand this
return 0;
}
Étonnamment code ci-dessus fonctionne sans erreurs et il imprime Bonjour.
Selon mes connaissances qui suit est la syntaxe de printf()
:
int printf(const char *format,argument_list);
Donc, selon cette syntaxe, printf()
devrait commencer avec la chaîne de format. Mais comme vous pouvez le voir dans le code ci-dessus printf()
est de commencer avec i>j
.
Signifie-t-il que je me trompe dans l'interprétation de la syntaxe de printf()?
Ne placer opérateur ternaire à l'intérieur de printf() est un cas spécial?
MODIFIER
Je sais à propos opérateur ternaire que je pose sur le premier argument de printf()
qui devrait être const char* qui me semble pas dans mon exemple.
- Le résultat de l'expression à l'intérieur de la 1ère paramètre doit être un pointeur vers une constante tableau de char, donc rien de surprenant.
- vous voulez dire quelque chose, même sans les guillemets pointeur vers une chaîne constante
- peut-être que les choses deviennent plus claires si vous l'écrire de cette façon:
printf((i>j?"%50s":"%s"), str)
- les deux
"%50s"
et"%s"
sont en fait des pointeurs constants des tableaux de char.i>j?"%50s":"%s"
est une expression. Le résultat de cette expression doit être un pointeur vers une constante char tableau. Je pense que vous confondez unconst char *
avec une expression constante, qui ne sont pas la même chose
Vous devez vous connecter pour publier un commentaire.
L'opérateur conditionnel:
est une expression, et elle doit être évaluée avant l'appel de la fonction elle-même peut être évaluée. On peut voir en allant sur le projet de standard C99 section
6.5.2.2
appels de Fonction qui dit:Alors, quel est le résultat de l'évaluation de l'opérateur conditionnel? Si nous allons à l'article
6.5.15
opérateur Conditionnel il est dit (accent mine):donc dans les deux cas le résultat est un littéral de chaîne qui va de décroissance de pointeur de char qui satisfait à l'exigence pour le premier argument de
printf
.Ce code est normal et n'est pas un cas particulier. L'exigence de
printf
est que le premier argument doit être de typeconst char*
, mais cela ne signifie pas nécessairement qu'il doit être une chaîne littérale comme"%s"
. Tout cela signifie que vous devez passer comme premier argument une expression du typeconst char*
. Eti>j?"%50s":"%s"
répond à cette exigence.i>j?"%50s":"%s"
est de typeconst char *
(techniquement, c'estconst char []
mais il n'a pas d'importance ici) donc je suppose que c'est votre exemple. Un autre exemple seraitfunc()
, oùfunc
est une fonction retournantconst char*
.C'est un opérateur ternaire et en ce que la condition i>j est faux donc %s sera passé comme paramètre à printf qui affichera la valeur du tableau de caractères qui est bonjour.
Non, vous n'êtes pas en l'interprétant mal.
En C, vous pouvez dire que c'est une expression au lieu d'une déclaration
Votre code est équivalent à:
L'opérateur ternaire est tout simplement une ligne
if
qui est utilisé comme une expression (alors que régulièrementif
est utilisé pour créer un bloc). Votre ligne est égale à ceci:Par conséquent,
Hello
est imprimé dans les deux situationsJe pense que vous avez bien compris le
printf
de syntaxe, mais je pense qu'il vous manque quelque chose à propos de la syntaxe du C.Il existe une forme de "compact comme SI la" déclaration formaté comme ça : ( condition ? vrai : faux )
Par exemple, vous pouvez faire :
Dans ce cas, b=128 et c=9.
Un autre exemple :
Dans ce cas vous pouvez le voir : La valeur est true
Sur votre exemple :
si i est supérieur à j vous utilisez "%50s" format et, si i est inférieur, vous utiliser "%s" format
Elle peut être vue comme :
Vous pouvez voir l'avantage du compact test.
Q: est-ce que je me trompe dans l'interprétation de la syntaxe de printf()?
R: Non, juste besoin de développer ce qui est autorisé.
Q: est de placer opérateur ternaire à l'intérieur de printf() est un cas spécial?
R: Non
?:
n'est pas spécial, mais parfois déroutant au premier coup d'œil.Le format fourni à
printf()
n'a pas besoin d'être un littéral. Il peut être n'importe quelle variable de chaîne.Il est une instruction de la forme: condition?conséquence:alternative.
La condition est vérifiée, et si c'est vrai, vous aurez la conséquente. sinon, vous aurez l'alternative.
Par exemple:
5>3 est vrai, de sorte que vous obtenez 10.