2013-10-01 3 views
4

J'ai une ligne de codeconversion de type explicite/implicite C++

double i = 1 + (long)1.5* 5.0f 

Ma question est quel est l'ordre de conversion et le résultat? Été à la recherche d'exemples comme celui-ci, mais en vain. Y a-t-il de bons guides qui pourraient m'aider à le comprendre?

+7

Si vous n'êtes pas sûr, mettez des crochets dans votre code. ((long) (1.5 * 5.0f)) –

+0

Parlez-vous de la table de préséance? –

+0

@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. –

Répondre

6

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

+0

* "1 est promu à flotter" *. Le terme "promu" est-il correct ici? Je pense qu'il devrait être "converti". – Nawaz

+1

@Nawaz: Oui, vous avez raison. Je ne peux jamais me rappeler exactement qui est qui. –

+0

@MikeSeymour Est-ce vraiment important? (Pour ce que ça vaut: les promotions se produisent même si les deux opérandes ont le même type, tout le reste est la conversion et je pense que la seule fois où une promotion en virgule flottante a lieu est un argument de fonction correspondant '...') –

0

This precedence table devrait vous dire tout ce que vous devez savoir.

  1. Avec: 1.5 est coulé à une long
  2. Multiplication: 1.5 * 5.0f, qui jette ce produit comme float
  3. Addition: 1 + (((long) 1.5) * 5.0f)
  4. Attribution: i = 1 + ((long) 1.5 * 5.0f)
+0

La conversion en long signifie que la multiplication est '1L * 5.0F'. – juanchopanza

1

Comme vous pouvez le voir à partir de this table, l'opérateur de cast a une priorité supérieure à la multiplication, mais w le conseil d'utiliser des parenthèses.

0

Si vous n'êtes pas sûr de ce que la priorité de l'opérateur de coulée est récrire alors l'expression (dans votre tête)

(long)1.5 * 5.0 

à

5.0 * (long)1.5 

Voici son ce assez évident a préséance et c'est la même chose avec la première version