Ma question est quel est l'ordre de conversion et le résultat?
La coulée est appliquée à 1.5
, ce qui donne une valeur long
avec 1
.
C'est converti en float
pour la multiplication avec 5.0f
, donnant une float
avec une valeur 5.0f
.
1
est converti en float
pour l'addition à cette valeur, ce qui donne une valeur float
avec 6.0f
.
Enfin, cela est promu à double
(en conservant la valeur 6.0
) pour attribuer à i
.
Cela suppose un format de virgule flottante non fou qui peut représenter exactement de petits entiers; sinon, il peut y avoir des erreurs d'arrondi.
Si vous voulez jeter le résultat de la multiplication, puis utilisez les parenthèses pour contrôler la priorité des opérateurs:
double i = 1 + (long)(1.5* 5.0f); // = 8.0
ou utiliser un C++ - fonte de style qui force l'utilisation des parenthèses:
double i = 1 + static_cast<long>(1.5* 5.0f)
Est-ce que je peux trouver des guides qui pourraient m'aider?
En voici un: http://en.cppreference.com/w/cpp/language/operator_precedence. Notez que le cast de type a une priorité plus élevée que la multiplication, qui est à son tour plus élevée que l'addition (3 contre 5 contre 6).
Si vous n'êtes pas sûr, mettez des crochets dans votre code. ((long) (1.5 * 5.0f)) –
Parlez-vous de la table de préséance? –
@MartinPerry - si vous n'êtes pas sûr, faire des recherches. L'ajout aveugle de parenthèses rend généralement un gâchis illisible. Ou, dans ce cas, utilisez un nouveau style: 'static_cast (1.5 * 5.0f)' semble être un bon candidat. –