Le programme suivant:
0
Produit la sortie:
int main() { printf("%d", '%'%'%'); return 0; }
Je voudrais savoir quelle en est la raison.
3 Réponses :
L'expression imprime le reste de la division de '%'
par '%'
qui est 0. C'est la valeur imprimée via "% d "
spécificateur de printf
.
Les caractères sont encodés sous forme de valeurs 8 bits (dans ASCII par exemple), constantes de caractères, reallity, tapez int
en C.
Dans ce cas, '%'
vaut 37, vous imprimez le reste de la division de 37 par 37.
Avoir '%'% '%'
équivaut à avoir 37% 37
.
Je sais ce qu'est modulo ... mon problème était de comprendre la syntaxe déroutante
@omEchan, les caractères ont une représentation numérique, dans ce cas '%'
en ASCII vaut 37, donc si vous divisez 37 par 37, le reste vaut 0.
@AdrianMole: D'un autre côté, je ne m'attends pas à ce que cette connaissance soit découvrable à partir de cette question. Stack Overflow accumule un grand nombre de questions et réponses qui ne sont pas facilement consultables. Ainsi, la question et la réponse peuvent avoir peu de valeur, mais c'est parce qu'elles ne sont pas découvrables, pas parce que les connaissances n'ont pas vraiment de valeur. J'aimerais voir Stack Overflow rediriger ou organiser des questions élémentaires et trouver un moyen de se concentrer sur des choses moins faciles à répondre ailleurs.
Le deuxième paramètre de printf
:
'%' % '%'
Plus facilement lu comme:
'%'%'%'
Applique le opérateur de module %
aux caractères '%'
et '%'
. Étant donné que les caractères sont codés sous forme de valeurs entières, cela revient à obtenir le reste de la division d'un nombre par lui-même.
La division d'un nombre différent de zéro (un caractère imprimable ne peut pas avoir le code 0) par lui-même résultera toujours dans un reste de 0, ce qui est en cours d'impression.
merci .. je n'ai pas compris que nous faisons l'opération entre deux caractères, maintenant tout est clair!
@omEchan vous pouvez utiliser l'opérateur %
sur le type char
, car il s'agit d'un type entier. Mais, ces caractères ne sont pas de type char
, ils sont de toute façon de type int
, et c'est une idée fausse courante qu'un caractère doit être un char
.
Les caractères sont encodés sous forme de valeurs 8 bits (si ASCII est utilisé). Les constantes de caractère ont le type int
en C. Différence subtile.
@AdrianMole: Si vous voulez être précis à ce sujet, les caractères sont encodés sous forme de valeurs CHAR_BIT
. ;-)
Notez cependant que pour une portabilité totale, le programme doit terminer sa sortie par une nouvelle ligne et la fonction Voici une version modifiée: Voici quelques variantes de la même idée: p > '%'% '%'
est une expression délibérément obscurcie qui évalue à 0
car c'est le reste de la division de '%' code> par lui-même.
'%'
est une constante de caractère qui en C est un entier de type int
et une valeur définie par l'implémentation ( 37
dans le jeu de caractères ASCII utilisé sur la grande majorité des systèmes actuels). Comme cette valeur ne peut pas être 0
, la diviser par elle-même équivaut à 1
avec un reste de 0
, d'où le code imprime 0 .
printf
doit être déclarée avec le prototype approprié en incluant
.#include <stdio.h>
int main() {
printf("%d\n", '%'%'%');
return 0;
}
'-'-'-'
, '^' ^ '^'
, ',
'>'> '>'
évaluent tous à 0
. '/' / '/'
et '=' == '='
sont évalués à 1
. '&' & '&' && '&' & '&'
et '|' | '|' || '|' | '|'
les deux évaluer à 1
.
Qu'essayez-vous de faire?
Savez-vous ce que fait l'opérateur
%
?Que pensez-vous du reste après avoir divisé 37 par 37? Parce que c'est ce que vous imprimez.
merci Adrian, je viens de ne pas voir que nous faisons l'opération entre les caractères
Le taux -4 pour cette question, il est à mon humble avis trop sévère. J'ai vu des questions de spam avec un taux plus élevé. Maintenant, ce n'est pas la question plus profonde et rapide du monde (du point de vue d'un développeur cherchant des solutions sur SO) mais c'est clair et délicat en même temps (ça m'a fait sourire).
@omEchan Incidemment, votre choix du caractère
%
était-il en quelque sorte lié à l'utilisation de ce caractère dans les spécificateurs de formatprintf
? (Cela aurait dû être demandé longtemps avant qu'une réponse ne soit publiée !!)'%'
est unint
(exactement comme72
à tous égards, sauf peut-être la valeur)