1
votes

Que signifie «%»% «%» et pourquoi est-il égal à 0?

Le programme suivant:

0

Produit la sortie:

int main()
{
    printf("%d", '%'%'%');
    return 0;
}

Je voudrais savoir quelle en est la raison.


7 commentaires

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 format printf ? (Cela aurait dû être demandé longtemps avant qu'une réponse ne soit publiée !!)


'%' est un int (exactement comme 72 à tous égards, sauf peut-être la valeur)


3 Réponses :


2
votes

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 .


3 commentaires

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.



7
votes

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.


4 commentaires

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 . ;-)



2
votes

'%'% '%' 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 .

Notez cependant que pour une portabilité totale, le programme doit terminer sa sortie par une nouvelle ligne et la fonction printf doit être déclarée avec le prototype approprié en incluant .

Voici une version modifiée:

#include <stdio.h>

int main() {
    printf("%d\n", '%'%'%');
    return 0;
}

Voici quelques variantes de la même idée: p >

  • '-'-'-' , '^' ^ '^' , ', '>'> '>' évaluent tous à 0 .
  • '/' / '/' et '=' == '=' sont évalués à 1 .
  • '&' & '&' && '&' & '&' et '|' | '|' || '|' | '|' les deux évaluer à 1 .


0 commentaires