De quoi il s'agit CE CODE C++

Résolu/Fermé
lotben - Modifié par Chris 94 le 18/02/2016 à 22:03
 lotben - 19 févr. 2016 à 16:35
de quoi il s'agit ce code c++ merci de me rependre ....

#include <iostream>
using namespace std ;
#define var2 (x,y) x*y + y*x
inline int VAR2 (int X , int Y) { return X*Y + Y*X ; }
main() {
int a = 5 ;
int j = 3 ;
int b = var2 (a%j , j+1) ;
int c = var2 ((a++)+(++j) , ++j) ;
int f = var2 (++a+j++ , j++) ;
int g = var2 (a++ , j++) ;
cout <<endl<<"a="<<a<<" b="<<b<<" c="<<c<<" j="<<j<<" f="<<f<<" g="<<g<<endl ;
cout <<endl ;
int D = 3 ;
int M = 2 ;
int E = VAR2 (D%M , M) ;
int H = VAR2 ((D++)+(++M) , ++M) ;
int K = VAR2 (++D+M++ , M++) ;
int N = VAR2 (D++ , M++) ;
cout <<"D="<<D<<" E="<<E<<" H="<<H<<" K="<<K<<" M="<<M<<" N="<<N<<endl ;
cout <<endl ;
system("pause");
}
A voir également:

2 réponses

jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
Modifié par jisisv le 19/02/2016 à 15:35
Ta macro var2 est complètement pourrave.
après modification élémentaire:
#define var2(x,y ) x*y + y*x

int main( int argc, char *ARGV[] )
{

  int a, b, c;

  c = var2( a + b , c );
  c = var2 ( (a + b ), c);
  return 0;
}


Pré-compilation:
johand@bata:~/src/CCM/C$  gcc -Wall -E -o badmacro.cc badmacro.c; grep "c = " badmacro.cc
c = a + b*c + c*a + b; // un monôme "a"
c = (a + b )*c + c*(a + b ); // pas de monôme "a"



Utilise plutôt #define var2(x,y ) ((x)*(y) + (y)*(x))
Si c'est un exercice, ton prof ferait mieux de te donner les bonnes bases. Etant mal voyant, je ne vais pas me donner des migraines avec des pré et post incréments. Une base du bon codage, c'est la lisibilité.

Je n'ai pas examiné la suite !!!
Gates gave ^W  sold  you the windows.
GNU gave us the whole house.(Alexandrin)
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
19 févr. 2016 à 15:39
Bonjour,


Ce code semble est fait pour montrer la différence entre une fonction inline et une Macro.
Le problème est qu'il utilise des instructions clairement indiquées comme 'unpredictable' par la norme. Alors comparer des choses imprévisibles (fonctions avec des ++) et des choses tordues (macros manquant de parenthèses) ne sert à rien!! Merci le prof!!

Exemples :
int c = var2 ((a++)+(++j) , ++j) ;
.
define on remplace x et y =>
int c = (a++)+(++j)*++j + ++j*(a++)+(++j);

=> on a fait plein de ++ auquels on ne s'attendait pas et on fait des additions où on attend des multiplications! Mais la résolution de l'expression est possible!

int H = VAR2 ((D++)+(++M) , ++M) ;
fonction inline => la fonction reçoit deux paramètres qui préincrémentent M!
quand la fonction est appelée, elle reçoit X=D'+M' et Y=M' (mais M a-t-il été préincrementé 1 ou 2 fois pour avant le calcul de X, et 1 ou 2 fois avant le calcul de Y ? le compilateur fait un choix arbitraire!!)
=> Ici cela semble plus clair et plus simple et pourtant le résultat est totalement imprévisible (le compilateur prévient par un warning!)
0
Merciiiii tt l monde
0