salut
j'arrive pas a comprendre comment cette instruction sera traitée par le compilateur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int a=16 , b=8, c=4; c* = !(a%2) ? (a-- , b++) : 1 ;
salut
j'arrive pas a comprendre comment cette instruction sera traitée par le compilateur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int a=16 , b=8, c=4; c* = !(a%2) ? (a-- , b++) : 1 ;
C'est un exercice scolaire ?
« … ? … : … » est un opérateur ternaire. Il s'agit d'une sorte de if-then-else condensé. Si l'expression en première position est vraie (différente de 0), alors l'expression entière prendra la valeur du deuxième terme. Sinon, ce sera celle du troisième.
Pour le reste, je te laisse chercher volontairement. Fais une proposition justifiée ici. On te dira si c'est bon ou pas, et pourquoi.
Essaye de mettre l'expression sous la forme if ... else ... et tu verras que tu trouveras la solution tout seul.![]()
salut
déchiffre ces ligne et tu va trouvé la solution :
Opérateur virgule
Syntaxe :
expression : expression1 , expression2
Sémantique :
expression1 est évaluée et sa valeur ignorée. expression2 est évaluée et sa valeur est la valeur de l'expression virgule.
Opérateur conditionnel
Syntaxe :
expression : expression1 ? expression2 : expression3
Sémantique :
expression1 est évaluée et doit délivrer une valeur de type entier. Si cette valeur est :
-
non nulle, expression2 est évaluée et le résultat est la valeur de l'expression conditionnelle.
-
nulle, expression3 est évaluée et le résultat est la valeur de l'expression conditionnelle.
salut
merci bcp pour vos réponse
maintenant j'ai testé ce code sur les pointeurs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 char *p1 = "Bonjour"; char *p2 = "Bonjour"; printf("%d &p1",p1); printf("\n%d &p2",p2);
mais j'arrive pas a comprendre pourquoi p2 pointe vers la même adresse que p1 malgré que j'ai pas fait p2 = p1 ?
Ces deux chaines littérales étant strictement identiques, c'est la même qui est utilisée. Les pointeurs pointent donc tous les deux vers la même chaine. Ceci est d'autant possible que cette chaine pointée par deux pointeurs différents est constante ; il est donc plus raisonnable pour le compilateur de créer une seule chaine au lieu de deux équivalentes.
Par contre, si tu tapais un code tel que :
Là, ce serait différent, tu aurais bien deux chaines à part entière.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char const * const p1 = "Bonjour"; char const * const p2 = "bonjour"; /* première lettre différente */
Avec un code tel que tu l'as écrit, le compilateur devrait toutefois te crier dessus (pas une erreur, mais un warning) pour t'inciter à rajouter des const ; en effet, ces deux chaines littérales sont accessibles uniquement en lecture.
Il n'y a rien de sorcier. Ce n'est même pas une question d' "intelligence" du compilateur. Il est tout simplement programmé pour.
Lorsqu'il compile, il effectue des optimisations plus ou moins poussées. S'il constate que deux chaines littérales sont strictement identiques, il n'a aucune raison d'encombrer le fichier de sortie (exécutable ou objet) inutilement.
Depuis longtemps. Comme te le dit Jeroman, c'est une question de bon sens.
Cela dit, tes questions sont parfaitement justifiées et pertinentes. Elles montrent que tu as compris comment cela fonctionne. Il reste que les compilateurs peuvent faire beaucoup mieux. Dans le cas de GCC, par exemple, l'option « -O » permet de préciser le niveau d'optimisation que l'on attend de la part du compilateur. Les compilateurs récents sont d'ailleurs capables de prouesses que l'on n'attendait pas d'eux a priori.
Ils sont assez intelligents pour supprimer les conditions qui seront toujours fausses, ou les instructions qui ne servent à rien.
Si on devait relire le code après compilation je pense qu'on serait très surpris.![]()
salut
merci pour vos interventions.
cette optimisation niveau compilation risquera pas d'engendrer des erreurs ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 char *p1 = "Bonjour"; char *p2 = "Bonjour";
par exemple si le programmeur n'as pas été attentif que p1 et p2 pointent vers le méme espace mémoire ,alors une modification de p2 va modifiée le contenu pointé par p1 sans que le programmeur ait conscience . ça été juste un exemple simple avec un petit " Bonjour " mais pour des situations plus complexe sa peut causer beaucoup de problèmes ....!!!
Tu n'es pas censé modifier les chaînes pointées. Avec les options normales, sous Windows, ces chaînes sont dans une zone mémoire à lecture seule et tu auras une Access Violation si tu tentes d'y écrire.
Et si tu utilises gcc, tu peux activer le warning -Wwrite-strings, qui fait considérer les chaînes comme des pointeurs const. Ainsi, tu auras un warning si tu n'écris pas avec const:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char *p1 = "Bonjour"; /*warning sous gcc avec l'option activée*/ char const *p2 = "Bonjour"; /*pas de warning.*/
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
salut
j'ai essayer cette commande sous Ubuntu
avec ce code
Code : Sélectionner tout - Visualiser dans une fenêtre à part gcc -Wwrite-strings teste appli2.c
et j'ai obtenu les Warings suivants
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include <stdio.h> #include <stdlib.h> int main( ) { char *p1 ="bonjour"; char *p2 ="bonjour"; *(p2+2) ="c"; printf("%s",p1); return EXIT_SUCCESS; // return 0; }
initialization discards qualifiers from pointer target type
assignement makes integer from pointer without a cast
La ligne qui pose problème est :
Tu as un pointeur sur caractères dans lequel tu essaie de ranger une chaine de caractères ("c" est une chaine de caractères, pas un caractère) et cela ne passe pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part *(p2+2) ="c";
Je pense que tu veux faire quelque chose comme cela
c'est à dire remplacer le 'n' de "bonjour" par un 'c'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part *(p2+2) ='c';
Comme indiqué un peu plus haut, tu t'exposes à des désagréments car la chaine "bonjour" n'est pas supposée pourvoir être modifiée (même si dans ton cas, cela semble fonctionner).
Une bonne méthode serait plutôt :
voire même
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char p2[] ="bonjour"; *(p2+2) ='c';
que je trouve plus lisible
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char p2[] ="bonjour"; p2[2] ='c';
Partager