La bonne réponse est :

if (  !(speed > 400 && memory > 32)  )
  System.out.println("Cette ordinateur est une tortue !");
else
  System.out.println("Acceptable comme ordinateur.");
Il serait probablement plus simple dans ce cas d'inverser les deux branches du if. Mais cette modification pourrait être indésirable dans des programmes plus conséquents.

Priorité du NOT

Il est très important de mettre des parenthèses autour de l'expression dont on désire inverser la valeu. L'évaluation de notre exemple se décompose ainsi :
! (  speed > 400   &&   memory > 32 )
     ------+------      -------+----

! (         T      &&          T   )

! (                 T              )

                   !T

                    F
L'opérateur NOT possède une priorité très élevée, il sera ainsi évalué en premier (avant les calculs arithmétiques ou les opérateurs relationnels) à moins que vous n'utilisiez des parenthèses. Par exemple, sans les parenthèse dans l'expression précédante, voilà ce qui serait arrivé :
!speed > 400   &&   memory > 32
--+---  
illegal: impossible d'utiliser l'opérateur ! sur une variable numérique

Comme l'opérateur ! a une forte priorité, le compilateur va essayer de l'appliquer à la variable speed, ce qui n'est pas possible !

parfois l'utilisation du NOT peut provoquer des confusions entrainant des erreurs dans les programmes. Il est généralement mieux d'exprimer directement la condition, et d'ajuster la logique du programme pour que cela fonctionne.

QUESTION 22:

Quel est la valeur  true/false de l'expression suivante ?
!( true || false )
Ne vous laissez pas perturber par la simplicité de l'expression