Généralités, types de base, opérateurs et expressions

Exercice 1

Énoncé

Éliminer les parenthèses superflues dans les expressions suivantes
 
a = (x+5)           /* expression 1 */
a = (x=y) + 2       /* expression 2 */
a = (x==y)          /* expression 3 */
(a<b) && (c<d)      /* expression 4 */
(i++) * (n+p)       /* expression 5 */
 
Solution
 
a = x+5             /* expression 1 */
L’opérateur + est prioritaire sur l’opérateur d’affectation =.
a = (x=y) + 2       /* expression 2 */
Ici, l’opérateur + étant prioritaire sur =, les parenthèses sont indispensables.
a = x==y            /* expression 3 */
L’opérateur == est prioritaire sur =.
a<b && c<d          /* expression 4 */
L’opérateur && est prioritaire sur l’opérateur <.
i++ * (n+p)         /* expression 5 */
L’opérateur ++ est prioritaire sur * ; en revanche, * est prioritaire sur +, de sorte qu’on ne
peut éliminer les dernières parenthèses.
 

Exercice 2

Énoncé
Soient les déclarations :
char c = '\x01' ;
short int p = 10 ;
Quels sont le type et la valeur de chacune des expressions suivantes :
p + 3            /* 1 */
c + 1            /* 2 */
p + c            /* 3 */
3 * p + 5 * c    /* 4 */
 




Solution
1. p est d’abord soumis à la conversion « systématique » short -> int, avant d’être
ajouté à la valeur 3 (int). Le résultat 13 est de type int.
2. c est d’abord soumis à la conversion « systématique » char -> int (ce qui aboutit à la
valeur 1), avant d’être ajouté à la valeur 1 (int). Le résultat 2 est de type int.
3. p est d’abord soumis à la conversion systématique short -> int, tandis que c est soumis
à la conversion systématique char
-> int
; les résultats sont alors additionnés
pour aboutir à la valeur 11 de type int.
4. p et c sont d’abord soumis aux mêmes conversions systématiques que ci-dessus ; le résultat
35 est de type int. 

Exercice 3

Énoncé
Soient les déclarations :
char c = '\x05' ;
int n = 5 ;
long p = 1000 ;
float x = 1.25 ;
double z = 5.5 ;
Quels sont le type et la valeur de chacune des expressions suivantes :
n + c + p             /* 1 */
2 * x + c             /* 2 */
(char) n + c          /* 3 */
(float) z + n / 2     /* 4 */
 
Solution
1. c est tout d’abord converti en int, avant d’être ajouté à n. Le résultat (10), de type int,
est alors converti en long, avant d’être ajouté à p. On obtient finalement la valeur 1010,
de type long.
2. On évalue d’abord la valeur de 2*x, en convertissant 2 (int) en float, ce qui fournit la
valeur 2.5 (de type float). Par ailleurs, c est converti en int (conversion systématique).
On évalue ensuite la valeur de 2*x,
en convertissant 2
(int) en float, ce qui
fournit la valeur 2.5 (de type float). Pour effectuer l’addition, on convertit alors la
valeur entière 5 (c) en float, avant de l’ajouter au résultat précédent. On obtient finalement
la valeur 7.75,
de type float.
3. n est tout d’abord converti en char (à cause de l’opérateur de « cast »), tandis que c est
converti (conversion systématique) en int. Puis, pour procéder à l’addition, il est nécessaire
de reconvertir la valeur de (char)
n
en int.
Finalement, on obtient la valeur 10,
de
type int.
4. z est d’abord converti en float, ce qui fournit la valeur 5.5 (approximative, car, en fait,
on obtient une valeur un peu moins précise que ne le serait 5.5 exprimé en double). Par
ailleurs, on procède à la division entière de n par 2, ce qui fournit la valeur entière 2. Cette
dernière est ensuite convertie en float, avant d’être ajoutée à 5.5, ce qui fournit le résultat
7.5,
de type float.
 

Exercice 4

Énoncé
 
Soient les déclarations suivantes :
int n = 5, p = 9 ;
int q ;
float x ;
Quelle est la valeur affectée aux différentes variables concernées par chacune des instructions
suivantes ?
q = n < p ;                 /* 1 */
q = n == p ;                /* 2 */
q = p % n + p > n ;         /* 3 */
x = p / n ;                 /* 4 */
x = (float) p / n ;         /* 5 */
x = (p + 0.5) / n ;         /* 6 */
x = (int) (p + 0.5) / n ;   /* 7 */
q = n * (p > n ? n : p) ;   /* 8 */
q = n * (p < n ? n : p) ;   /* 9 */ 
 
Solution

1. 1
2. 0
3. 5 (p%n vaut 4, tandis que p>n vaut 1).
4. 1 (p/n est d’abord évalué en int, ce qui fournit 1 ; puis le résultat est converti en
float, avant d’être affecté à x).
5. 1.8 (p est converti en float, avant d’être divisé par le résultat de la conversion de n en
float).
6. 1.9 (p est converti en float, avant d’être ajouté à 0.5 ; le résultat est divisé par le
résultat de la conversion de n en float).
7. 1 (p est converti en float, avant d’être ajouté à 0.5 ; le résultat (5.5) est alors converti
en int avant d’être divisé par n).
8. 25
9. 45
 

Exercice 5

Énoncé
Quels résultats fournit le programme suivant :
#include <iostream>
using namespace std ;
main ()
{
   int i, j, n ;
   i = 0 ; n = i++ ;
   cout << "A : i = " << i << " n = " << n << "\n" ;
  
   i = 10 ; n = ++ i ;
   cout << "B : i = " << i << " n = " << n << "\n" ;
   i = 20 ; j = 5 ; n = i++ * ++ j ;
   cout << "C : i = " << i << " j = " << j << " n = " << n << "\n" ;
   i = 15 ; n = i += 3 ;
   cout << "D : i = " << i << " n = " << n << "\n" ;
   
   i = 3 ; j = 5 ; n = i *= --j ;
   cout << "E : i = " << i << " j = " << j << " n = " << n << "\n" ;
} 
 
Solution 

A : i = 1 n = 0
B : i = 11 n = 11
C : i = 21 j = 6 n = 120
D : i = 18 n = 18
E : i = 12 j = 4 n = 12 

Exercice 6

Énoncé
Quels résultats fournira ce programme :
#include <iostream>
using namespace std ;
main()
{
   int n=10, p=5, q=10, r ;
   r = n == (p = q) ;
   cout << "A : n = " << n << "  p = " << p << " q = " << q
                      << " r = " << r << "\n" ;
   n = p = q = 5 ;
   n += p += q ;
   cout << "B : n = " << n << " p = " << p << " q = " << q << "\n" ;
   q = n < p ? n++ : p++ ;
   cout << "C : n = " << n << " p = " << p << " q = " << q << "\n" ;
   q = n > p ? n++ : p++ ;
   cout << "D : n = " << n << " p = " << p << " q = " << q << "\n" ;
}
 
Solution 
A : n = 10  p = 10  q = 10  r = 1
B : n = 15  p = 10  q = 5
C : n = 15  p = 11  q = 10
D : n = 16  p = 11  q = 15
 

Exercice 7

Énoncé
Quels résultats fournira ce programme :
#include <iostream>
using namespace std ;
main()
{  int n, p, q ;

   n = 5 ; p = 2 ;                                /* cas 1 */
   q = n++ >p || p++ != 3 ;
   cout << "A : n = " << n << " p = " << p << " q = " << q << "\n" ;

   n = 5 ; p = 2 ;                                /* cas 2 */
   q = n++<p || p++ != 3 ;
   cout << "B : n = " << n << " p = " << p << " q = " << q << "\n" ;

   n = 5 ; p = 2 ;                                /* cas 3 */
   q = ++n == 3 && ++p == 3 ;
   cout << "C : n = " << n << " p = " << p << " q = " << q << "\n" ;
   n = 5 ; p = 2 ;                                /* cas 4 */
   q = ++n == 6 && ++p == 3 ;
   cout << "D : n = " << n << " p = " << p << " q = " << q << "\n" ;
}
 

Solution 
Il ne faut pas oublier que les opérateurs && et || n’évaluent leur second opérande que lorsque
cela est nécessaire. Ainsi, ici, il n’est pas évalué dans les cas 1 et 3. Voici les résultats fournis
par ce programme :
A : n = 6  p = 2  q = 1
B : n = 6  p = 3  q = 1
C : n = 6  p = 2  q = 0
D : n = 6  p = 3  q = 1 
 
Suivant
« Précédent
Précédent
Suivant »

ConversionConversion EmoticonEmoticon

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.