Pourquoi ne pas « 0f » traité comme un littéral à virgule flottante en C ++?
-
09-10-2019 - |
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.
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 quefloat
opérandes à effectuer dansfloat
arithmétique plutôt quedouble
, un procédé de exprimant explicitesfloat
constantes est souhaitable.long double
Type soulève des questions similaires.
F
etL
ont été ajoutées suffixes pour transmettre des informations de type avec les constantes flottantes, un peu comme le suffixeL
fait pour des entiers longs. Le défaut type de constantes flottantes reste double pour la compatibilité avec la pratique antérieure. Minusculesf
etl
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.