Question

Pourquoi ne pas 0f traité comme un littéral à virgule flottante en C ++?

#include <iostream>

using namespace std;

int main(){
  cout << 0f << endl;

  return 0;
}

Compiler le me donne ci-dessus

  

C2509 (erreur de syntaxe: 'mauvais suffixe nombre')

en utilisant VS2008.

Était-ce utile?

La solution

S'il y avait une raison explicitement pour cette décision de conception, il serait dans le C99 « Explications » le document (C ++ copié tout ce genre de choses verbatim de C sans remettre en elle). Mais il n'y a pas. Ceci est tout ce qui est dit sur le suffixe « f »:

  

§6.4.4.2 constantes flottantes

     

Conformément à la pratique actuelle, est définie une constante virgule flottante pour avoir   saisissez double . Puisque C89 permet des expressions qui ne contiennent que float opérandes   à effectuer dans float arithmétique plutôt que double , un procédé de   exprimant explicites float constantes est souhaitable. long double Type   soulève des questions similaires.

     

F et L ont été ajoutées suffixes pour transmettre des informations de type avec   les constantes flottantes, un peu comme le suffixe L fait pour des entiers longs. Le défaut   type de constantes flottantes reste double pour la compatibilité avec la pratique antérieure.   Minuscules f et l sont également autorisés comme suffixes.

une raison implicite, cependant. Notez le libellé: « ... les suffixes ont été ajoutées pour transmettre des informations de type avec des constantes flottantes. » Les auteurs de la norme songeaient constantes numériques comme déjà étant sans ambiguïté soit entier ou en virgule flottante par le temps que vous obtenez au suffixe. Le suffixe est uniquement pour une spécificité supplémentaire dans la catégorie, il ne peut pas retourner un numéro d'une catégorie à l'autre. Ceci est soutenue par la grammaire réelle (C99 §6.4.4) qui first définit des constantes numériques comme étant soit des constantes entières ou des constantes de flottement, et définit alors séparés cours de suffixes pour chacun.

Autres conseils

En supposant la grammaire utilisée par C ++ pour les constantes de virgule flottante est identique à celui C (qui je pense est vrai), nous avons:

Les définitions de certains raccourcis provenant ANSI C grammar

D      [0-9]
L      [a-zA-Z_]
H      [a-fA-F0-9]
E      [Ee][+-]?{D}+
FS     (f|F|l|L)
IS     (u|U|l|L)*

Maintenant, le f ou F vous voyez à la fin des points flottants est à définir dans FS ci-dessus.

Maintenant nous allons voir la grammaire de reconnaître des constantes de virgule flottante valides:

{D}+{E}{FS}?        
{D}*"."{D}+({E})?{FS}?  
{D}+"."{D}*({E})?{FS}?  

Maintenant, si vous voyez bien il n'y a pas de règle qui permettrait d'identifier 0f.

Utilisation règle1 nous pouvons avoir 0e0f

Utilisation règle2 nous pouvons avoir .0f ou 0.0f

Utilisation Règle3 nous pouvons avoir 0.f ou 0.0f

Qu'arrive-t-en fait dans votre cas est le 0 de 0f sera consommée par l'analyseur lexical comme D constante entière et la f sera consommée comme le jeton FS. Maintenant, lorsque l'analyse syntaxique voit un D suivi par FS pour lesquels il n'y a pas de règle de correspondance, il recrache l'erreur:

error: invalid suffix "f" on integer constant

Parce que le 0 est une constante entière.

edit: Le message d'erreur donné par codepad.org (en supposant g ++) peut-être un peu plus facile à comprendre. « Erreur: suffixe invalide « f » à la constante entière ». Un « 0.F » fonctionnera parce que 0. (ou 0,0, la même chose) est une constante décimale, et en demandant une constante décimale pour être un flotteur plus de sens que de demander une constante entière à un flotteur:)

Parce que vous avez besoin 0.0f.

Voici un « parce que » pour vous. Si une constante int avec un suffixe f a été automatiquement converti en float, alors 0x0f serait ambigu

Ce n'est pas nécessairement la seule raison, mais un suffixe l ou L peut être appliqué à un littéral entier ou à un littéral à virgule flottante. 42L est de type long int; 42.0L est de type long double.

Un littéral numérique avec un suffixe L doit être désambiguïsé pour déterminer si elle ou son entier à virgule flottante. Permettre un suffixe F par lui-même pour déterminer le type d'un littéral serait incohérent et pouvant prêter à confusion. Il serait également rendre plus difficile d'ajouter de nouveaux suffixes dans les versions futures de la langue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top