US

Expressions et opérateurs

Question 1

Parmi ces expressions, lesquelles sont valable et lesquelles provoquent des erreurs ? Pour les expressions valables, donnez leur valeur et leur type, et pour celles qui provoquent une erreur, donnez-en la raison.

  • 5 * 2 >= 8
  • 2 == 3 - 1
  • (2 == 3) - 1
  • 27 + 'c' * 3
  • 19 \ 2
  • 2 <<< 3L
  • 3 + 2 == 5 ^ 1 <= 1
  • 3 = 7 || 3 = 8
  • 6 - 2 == 2 * 2 | 5 % 0 == 1
  • 5 << 2 % 5 == 0

Solution

  • 5 * 2 >= 8

    Valide, vaut true de type boolean.

  • 2 == 3 - 1

    Valide, vaut true de type boolean.

  • (2 == 3) - 1

    Pas valide, l'opérateur - ne peut pas s'appliquer entre un boolean (2 == 3) et un int (1).

  • 27 + 'c' * 3

    Valide, vaut 324 de type int.

  • 19 \ 2

    Pas valide, l'opérateur \ n'existe pas, la division est représentée par l'opérateur /.

  • 2 <<< 3L

    Non valide, l'opérateur <<< n'existe pas.

  • 3 + 2 == 5 ^ 1 <= 1

    Valide, vaut false de type boolean.

  • 3 = 7 || 3 = 8

    Pas valide, l'opérateur || ne peut pas s'appliquer entre deux int (7 || 3). De plus, l'opérande de gauche de l'opérateur d'affectation doit être une variable.

  • 6 - 2 == 2 * 2 | 5 % 0 == 1

    Valide, mais erreur d'exécution à cause d'une division par zéro (5 % 0).

  • 5 << 2 % 5 == 0

    Valide, vaut false de type boolean.

Question 2

Ces deux expressions ont-elles la même valeur ? Si oui, laquelle; si non, pourquoi ? (a et b valent false, c et d valent true)

a && b || c && d
(a && b) || (c && d)

Solution

Les deux expressions sont équivalentes étant donné que l'opérateur && a une plus grande priorité que l'opérateur ||. Elles ont donc la même valeur qui est true.

Question 3

Ces deux expressions ont-elles la même valeur ? Si oui, laquelle; si non, pourquoi ? (a et b valent false, c et d valent true)

a || b && c || d
(a || b) && (c || d)

Solution

Les deux expressions ne sont pas équivalentes étant donné que l'opérateur || a une priorité plus basse que &&. Elles n'ont pas la même valeur, la première vaut true et la seconde false.

Question 4

Soit x une variable de type short. Les deux séquences d'instructions suivantes produisent-elles le même résultat dans toutes les situations ? Argumentez.

  • boolean a = (x != 0);
    boolean b = (1 / x > 0.5);
    System.out.println (a && b);
  • boolean b = (x != 0) && (1 / x > 0.5);
    System.out.println (b);

Solution

Il y a un cas dans lequel les deux séquences d'instructions ne produisent pas le même résultat. Si la variable x vaut 0, la seconde instruction de la première séquence produira une erreur d'exécution à cause de la division par zéro. Dans la seconde séquence, grâce à la propriété de court-circuit de l'opérateur &&, la division par zéro n'aura pas lieu. Cette séquence s'exécute sans erreur et la valeur de b sera false.

Question 5

Complétez le programme suivant de telle manière à convertir la température stockée dans la variable fahrenheit, exprimée en degrés Fahrenheit, en une température exprimée en degrés Celsius. La formule de conversion est :

conversion celsius fahrenheit

De plus, on souhaite que la température en degrés Celsius soit donnée avec un seul chiffre après la virgule. Par exemple, pour 65,5 degrés Fahrenheit, le programme doit calculer 18,6 degrés Celsius.

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
public static void main(String[] args)
{
    double fahrenheit = 65.5; // 65,5 degrés Fahrenheit
 
    // Conversion en degrés Celsius
    double celsius;
 
    /* À compléter */
 
    System.out.println (fahrenheit);
    System.out.println (celsius);
}

Solution

La première chose est de calculer la valeur de la température en degrés. Pour la multiplication par 5/9, il ne faut pas oublie d'au moins convertir l'un des deux opérandes en double pour que la division ne soit pas une division entière.

Ensuite, on ne veut garder qu'un chiffre après la virgule. La technique est de multiplier le nombre par 10, d'extraire la partie entière avec un cast en int, ensuite on divise le résultat obtenu par 10.0.

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
public static void main (String[] args)
{
    double fahrenheit = 65.5; // 65,5 degrés Fahrenheit
 
    // Conversion en degrés Celsius
    double celsius = (fahrenheit - 32) * (5.0 / 9);
 
    // Limitation à un chiffre après la virgule
    celsius = (int) (10 * celsius ) / 10.0;
 
    System.out.println (fahrenheit);
    System.out.println (celsius);
}

Question 6

Soit le programme suivant :

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
public static void main(String[] args)
{
    int x, y;
    float z;
    double t;
 
    x = (int) 8.6D;
    t = 0.125F;
    z = 5.3D;
    z = (float) 5.3D;
 
    y = t * x;
    y = (int) t * x;
    y = (int) (t * x);
 
    System.out.println (y * z);
}
  1. Il y a des instructions erronées dans cette méthode. Lesquelles ? Pourquoi ?

  2. Supposons les lignes erronées supprimées. Quelle est la valeur de la variable y à la ligne 13 ? et à la ligne 14 ? Et que va afficher le programme à l'écran ?

Solution

    • Ligne 9 : on tente d'affecter une valeur de type double (5.3D) dans une variable de type float (z), ce qui est une conversion avec perte d'information.
    • Ligne 12 : x est converti en double par promotion arithmétique. La valeur de l'expression t * x sera donc de type double. On tente d'affecter cette valeur à une variable de type int, ce qui est un conversion avec perte d'information.
  1. Les lignes 9 et 12 sont donc supprimées.

    • La valeur de la variable y à la ligne 13 est 0 car t qui vaut 0.125 est converti en int et vaut donc 0, ce qui fait que la valeur de y est 0.
    • La valeur de la variable y à la ligne 14 est 1 et correspond à la valeur de t * x (0.125 × 8 = 1.0) qui est ensuite convertie en int, ce qui fait que la valeur de y est 1.

    Après exécution, le programme affichera 5.3 à l'écran.

Question 7

Pour chacune des expressions suivantes, donnez l'expression complètement parenthésée correspondante :

  • 2 + 3 - 5 + 12 * 2 / 8 - 0
  • 5 + 2 == 4 * 5 + 1 / 2
  • 5 <= 8 % 2
  • 5 <= 9 == 3 >= 6 - 3
  • 12 % 3L << 3 > = 5 ? 2 : 9

Solution

  • ((((2 + 3) - 5) + ((12 * 2) / 8)) - 0)
  • ((5 + 2) == ((4 * 5) + (1 / 2)))
  • (5 <= (8 % 2))
  • ((5 <= 9) == (3 >= (6 - 3)))
  • ((((12 % 3L) << 3) >= 5) ? 2 : 9)

Question 8

Soient les instructions suivantes :

int i = 2;
byte b = (byte) i + 3;

La seconde instruction ne compile pas. Expliquez pourquoi et corrigez le problème.

Solution

L'expression (byte) i + 3 est équivalente à l'expression ((byte) i) + 3, c'est-à-dire que la variable i est convertie en byte. Ensuite, on applique l'opérateur +, si on suit la règle de promotion arithmétique, les deux opérandes vont être convertis en int et le résultat sera également un int qu'on tente d'affecter à une variable de type byte, ce qui provoque une erreur de compilation. Pour résoudre le problème, il faut écrire (byte) (i + 3).

Question 9

Quel est le nombre entier représenté par chacun des nombres binaires suivants ? (les nombres sont codés sur 8 bits)

  • 00110101
  • 11110100
  • 11101000
  • 00101101

Solution

  • 00110101 représente l'entier positif : 25 + 24 + 22 + 20 = 32 + 16 + 4 + 1 = 53.
  • 11110100 représente un entier négatif. On doit calculer le complément à deux en calculant d'abord l'inverse (00001011), puis en ajoutant 1 (00001100). Le nombre représenté est donc : -(23 + 22) = -(8 + 4) = -12.
  • 11101000 représente un entier négatif. On doit calculer le complément à deux en calculant d'abord l'inverse (00010111), puis en ajoutant 1 (00011000). Le nombre représenté est donc : -(24 + 23) = -(16 + 8) = -24.
  • 00101101 représente l'entier positif : 25 + 23 + 22 + 20 = 32 + 8 + 4 + 1 = 45.

Question 10

Donnez la représentation binaire sur 8 bits des nombres entiers suivants ?

  • -17
  • 122
  • -98
  • 256

Solution

On s'aide de la table des puissances de 2 : 128, 64, 32, 16, 8, 4, 2, 1 .

  • 17 = 16 + 1 = 24 + 20 s'écrit 00010001 en binaire sur 8 bits. Comme on veut -17, il faut prendre le complément à deux en inversant (11101110) puis en ajoutant 1, ce qui donne finalement 11101111.
  • 122 = 64 + 32 + 16 + 8 + 2 s'écrit 01111010 en binaire.
  • 98 = 64 + 32 + 2 s'écrit 01100010 en binaire sur 8 bits. Comme on veut -98, il faut prendre le complément à deux en inversant (10011101) puis en ajoutant 1, ce qui donne finalement 10011110.
  • 256 ne peut pas être représenté sur 8 bits, le plus grand entier positif représentable sur 8 bits étant 28 - 1 - 1 = 127.

Question 11

Soient les instructions suivantes :

short s = 250;
byte b = (byte) s;

Quelle est la valeur de la variable b ?

Solution

Les short sont encodés sur 16 bits. La valeur 250 en binaire en complément à deux est 0000000011111010. On fait une conversion explicite en byte qui sont encodés sur 8 bits. On garde donc les 8 bits les moins significatifs, c'est-à-dire 11111010. Il s'agit donc d'un nombre négatif. On doit donc calculer le complémente à deux en calculant d'abord l'inverse (00000101), puis en ajoutant 1 (00000110). Le nombre représenté est donc : -(22 + 21) = -(4 + 2) = -6.

Vous pouvez télécharger la liste des questions. Si vous avez des problèmes ou que vous ne comprenez pas bien une question, rendez-vous sur le forum consacré aux exercices.

  • Espace membre
  • Learning Center
  • Les forums
  • Livre d'or
  • Imprimer
  • Boutique
  • Info
  • Règlement
  • Erreur
  • Newsletter

MyPagerank.Net

Firefox 3.6

Browse Happy logo

Open Clip Art Library

Join our Facebook Group

Twitter

Copyright © 2000-2017 UKO. Toute reproduction strictement interdite sans autorisation du webmaster

Valid XHTML 1.1 !
Valid CSS2 !
Level Triple-A conformance icon, W3C-WAI Web Content Accessibility Guidelines 1.0
ICRA Internet Content Rating Association
Creative Commons License
Site optimisé pour Firefox avec une résolution 1024x768 --- Page chargée en 0.0599000 secondes --- This site uses Thumbshots previews