Une ligne de code qui beugue

Le problème exposé dans ce sujet a été résolu.

Bonsoir, je reviens avec une question relou en c :

J’essaye d’afficher :

$a = 6 \implies a++ = 6 \implies a = 7 \implies ++a = 8 \implies a = 8$

avec le code suivant :

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main (void)
{
    int a = 6;

    printf("a = %d => a++ = %d => a = %d => ++a = %d => a = %d", a, a++, a, ++a, a);
    return 0; 
}

Mais ça ne semble pas être correct, je reçoit l’erreur suivante :

Wesh?

Je suis obligé de découper le printfcomme ça :

1
2
3
4
5
printf("a = %d =>", a);
printf(" a++ = %d =>", a++);
printf(" a = %d =>", a);
printf(" ++a = %d =>", ++a);
printf(" a = %d\n", a);

Une idée?

+0 -0

La spécification du langage ne dit pas dans quel ordre seront passés les arguments à une fonction.

Ici tu passes un tableau de caractères puis 5 nombres. Comme la spécification ne dit pas dans quel ordre les arguments sont passés, le compilateur te dit de faire attention. C’est pas une erreur.

Mais suivant avec quoi tu compiles ton code, tu pourras obtenir un résultat différent. Imagine un truc du genre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
function foo (a, b) {
  print a
  print b
}

x = 0

foo (x, x++)
/*
Si x++ est passé avant x, tu auras
1
1

Si x++ est passé après x, tu auras
0
1
*/
+3 -0

Il n’y a pas de résultat attendu dans ta situation car tu es dans un cas indéterminé par la norme avec la valeur de a qui change plusieurs fois au sein de la même instruction (à savoir passer a à printf). Le compilateur ou ton système peut faire ce qu’il veut dans ce cas.

Pour avoir un résultat prévisible, reproductible et standard, tu dois découper l’appel à printf.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte