Moi je dis qu'il est effectivement bien obligé, histoire d'attraper un truc
comme
#include<limits.h>
#define A 2
#define B (INT_MAX+1u)
char a[A*B];
Moi je dis qu'il est effectivement bien obligé, histoire d'attraper un truc
comme
#include<limits.h>
#define A 2
#define B (INT_MAX+1u)
char a[A*B];
Moi je dis qu'il est effectivement bien obligé, histoire d'attraper un truc
comme
#include<limits.h>
#define A 2
#define B (INT_MAX+1u)
char a[A*B];
Dans l'article <gg6svg$rle$,
Antoine Leca écrit:En news:20081117175312$, Vincent Lefevre va
escriure:donc 1 << 16 est aussi positif, et de même que (1 << 16) * 2.
Pas forcément: cf. C99 6.3.1.3p3.
Attends, ceci concerne les *conversions*. Ici, pas de conversion.
Les règles pour les opérations, style * (multiplication), sont
différentes.
Cf 6.5#5: c'est de l'undefined behavior.
Ton propos initial était de refuser l'argument de l'article
<gf9s85$rbc$, où Charlie Gordon
écrit:- le compilateur est obligé de savoir faire l'évaluation des
expressions constantes au moment de la compilation, sinon
impossible de déclarer ``char a[A * B]''.
Un exemple n'a jamais rien prouvé sur le cas général. Le point
important est qu'il *existe* des expressions constantes que le
compilateur n'a pas besoin d'évaluer complètement (i.e. d'en
connaître le résultat) pour qu'il se comporte de manière conforme
à la norme.
De telles expressions constantes peuvent alors très
bien être évaluées à l'exécution.
Par exemple, pour A*B sur du non signé, on peut raisonner sur la
valuation 2-adique.
D'autre part, si "char a[A*B];" se trouve dans une fonction (qui
pourrait ne jamais être appelée), doit-on avoir un diagnostic?
Dans l'article <gg6svg$rle$1@shakotay.alphanet.ch>,
Antoine Leca <root@localhost.invalid> écrit:
En news:20081117175312$32a2@prunille.vinc17.org, Vincent Lefevre va
escriure:
donc 1 << 16 est aussi positif, et de même que (1 << 16) * 2.
Pas forcément: cf. C99 6.3.1.3p3.
Attends, ceci concerne les *conversions*. Ici, pas de conversion.
Les règles pour les opérations, style * (multiplication), sont
différentes.
Cf 6.5#5: c'est de l'undefined behavior.
Ton propos initial était de refuser l'argument de l'article
<gf9s85$rbc$1@registered.motzarella.org>, où Charlie Gordon
<news@chqrlie.org> écrit:
- le compilateur est obligé de savoir faire l'évaluation des
expressions constantes au moment de la compilation, sinon
impossible de déclarer ``char a[A * B]''.
Un exemple n'a jamais rien prouvé sur le cas général. Le point
important est qu'il *existe* des expressions constantes que le
compilateur n'a pas besoin d'évaluer complètement (i.e. d'en
connaître le résultat) pour qu'il se comporte de manière conforme
à la norme.
De telles expressions constantes peuvent alors très
bien être évaluées à l'exécution.
Par exemple, pour A*B sur du non signé, on peut raisonner sur la
valuation 2-adique.
D'autre part, si "char a[A*B];" se trouve dans une fonction (qui
pourrait ne jamais être appelée), doit-on avoir un diagnostic?
Dans l'article <gg6svg$rle$,
Antoine Leca écrit:En news:20081117175312$, Vincent Lefevre va
escriure:donc 1 << 16 est aussi positif, et de même que (1 << 16) * 2.
Pas forcément: cf. C99 6.3.1.3p3.
Attends, ceci concerne les *conversions*. Ici, pas de conversion.
Les règles pour les opérations, style * (multiplication), sont
différentes.
Cf 6.5#5: c'est de l'undefined behavior.
Ton propos initial était de refuser l'argument de l'article
<gf9s85$rbc$, où Charlie Gordon
écrit:- le compilateur est obligé de savoir faire l'évaluation des
expressions constantes au moment de la compilation, sinon
impossible de déclarer ``char a[A * B]''.
Un exemple n'a jamais rien prouvé sur le cas général. Le point
important est qu'il *existe* des expressions constantes que le
compilateur n'a pas besoin d'évaluer complètement (i.e. d'en
connaître le résultat) pour qu'il se comporte de manière conforme
à la norme.
De telles expressions constantes peuvent alors très
bien être évaluées à l'exécution.
Par exemple, pour A*B sur du non signé, on peut raisonner sur la
valuation 2-adique.
D'autre part, si "char a[A*B];" se trouve dans une fonction (qui
pourrait ne jamais être appelée), doit-on avoir un diagnostic?
6.5p5 revient à dire que le résultat de A*B a un comportement indéfini, car
il est en dehors des valeurs représentables pour le type unsigned int (dans
le cas général) ; même punition pour UINT_MAX+1 ou -1u ;
auquel cas il y a pas mal de code C qui est complètement
inutilisable...
Je ne suis pas d'accord avec ta logique, que je lis comme : il existe au
moins une expression constante pour laquelle un compilateur peut se
permettre de ne pas calculer la valeur au moment de la compilation, donc il
n'est pas obligé de savoir faire l'évaluation des expressions constantes.
> De telles expressions constantes peuvent alors très
> bien être évaluées à l'exécution.
Encore une fois, personne ne nie cela, au contraire cela a été la première
réponse d'Erwan, de Marc B., ou de moi-même. Et on peut inférer de la
réponse de Wykaaa qu'il est d'acord aussi.
> Par exemple, pour A*B sur du non signé, on peut raisonner sur la
> valuation 2-adique.
J'ai déjà répondu à cela. On peut toujours inventer des manières de ne pas
calculer le produit, mais cela revient quand même à faire une évaluation de
sa valeur,
> D'autre part, si "char a[A*B];" se trouve dans une fonction (qui
> pourrait ne jamais être appelée), doit-on avoir un diagnostic?
Je dirais que oui, cf 5.1.1.3, et la formulation de 6.10.1p5 qui cherche
(peut-être imparfaitement) à autoriser une syntaxe invalide à être présente
dans un groupe sauté par #if 0 ou similaire.
6.5p5 revient à dire que le résultat de A*B a un comportement indéfini, car
il est en dehors des valeurs représentables pour le type unsigned int (dans
le cas général) ; même punition pour UINT_MAX+1 ou -1u ;
auquel cas il y a pas mal de code C qui est complètement
inutilisable...
Je ne suis pas d'accord avec ta logique, que je lis comme : il existe au
moins une expression constante pour laquelle un compilateur peut se
permettre de ne pas calculer la valeur au moment de la compilation, donc il
n'est pas obligé de savoir faire l'évaluation des expressions constantes.
> De telles expressions constantes peuvent alors très
> bien être évaluées à l'exécution.
Encore une fois, personne ne nie cela, au contraire cela a été la première
réponse d'Erwan, de Marc B., ou de moi-même. Et on peut inférer de la
réponse de Wykaaa qu'il est d'acord aussi.
> Par exemple, pour A*B sur du non signé, on peut raisonner sur la
> valuation 2-adique.
J'ai déjà répondu à cela. On peut toujours inventer des manières de ne pas
calculer le produit, mais cela revient quand même à faire une évaluation de
sa valeur,
> D'autre part, si "char a[A*B];" se trouve dans une fonction (qui
> pourrait ne jamais être appelée), doit-on avoir un diagnostic?
Je dirais que oui, cf 5.1.1.3, et la formulation de 6.10.1p5 qui cherche
(peut-être imparfaitement) à autoriser une syntaxe invalide à être présente
dans un groupe sauté par #if 0 ou similaire.
6.5p5 revient à dire que le résultat de A*B a un comportement indéfini, car
il est en dehors des valeurs représentables pour le type unsigned int (dans
le cas général) ; même punition pour UINT_MAX+1 ou -1u ;
auquel cas il y a pas mal de code C qui est complètement
inutilisable...
Je ne suis pas d'accord avec ta logique, que je lis comme : il existe au
moins une expression constante pour laquelle un compilateur peut se
permettre de ne pas calculer la valeur au moment de la compilation, donc il
n'est pas obligé de savoir faire l'évaluation des expressions constantes.
> De telles expressions constantes peuvent alors très
> bien être évaluées à l'exécution.
Encore une fois, personne ne nie cela, au contraire cela a été la première
réponse d'Erwan, de Marc B., ou de moi-même. Et on peut inférer de la
réponse de Wykaaa qu'il est d'acord aussi.
> Par exemple, pour A*B sur du non signé, on peut raisonner sur la
> valuation 2-adique.
J'ai déjà répondu à cela. On peut toujours inventer des manières de ne pas
calculer le produit, mais cela revient quand même à faire une évaluation de
sa valeur,
> D'autre part, si "char a[A*B];" se trouve dans une fonction (qui
> pourrait ne jamais être appelée), doit-on avoir un diagnostic?
Je dirais que oui, cf 5.1.1.3, et la formulation de 6.10.1p5 qui cherche
(peut-être imparfaitement) à autoriser une syntaxe invalide à être présente
dans un groupe sauté par #if 0 ou similaire.
Dans l'article <gggk09$7vq$,
Antoine Leca écrit:6.5p5 revient à dire que le résultat de A*B a un comportement
indéfini, car il est en dehors des valeurs représentables pour le
type unsigned int (dans le cas général) ; même punition pour
UINT_MAX+1 ou -1u ;
Pourquoi UINT_MAX+1 est-il du comportement indéfini? Il n'y a pas
d'overflow sur du ***non signé***.
Alors je ne comprends pas.
Je ne suis pas d'accord avec ta logique, que je lis comme : il
existe au moins une expression constante pour laquelle un
compilateur peut se permettre de ne pas calculer la valeur au moment
de la compilation, donc il n'est pas obligé de savoir faire
l'évaluation des expressions constantes.
Pas de *toutes* les expressions constantes. [Attention à la négation
du "pour tout".]
Pourtant Charlie a dit:le compilateur est obligé de savoir faire l'évaluation des
expressions constantes au moment de la compilation, sinon impossible
de déclarer ``char a[A * B]''.
Moi je dis:
Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
expressions constantes, il n'est pas forcément impossible de
déclarer ``char a[A * B]''.
Cela revient au même au niveau de la sémantique, mais pas au niveau
du temps de calcul (même si la norme ne se préoccupe pas du temps
de calcul, cette question d'implémentation était dans la question
initiale).
Alors comment ça se fait que lorsque la contrainte 6.6#4 "Each
constant expression shall evaluate to a constant that is in the
range of representable values for its type." est violée, gcc
n'émet pas toujours un diagnostic? Bug?
Dans l'article <gggk09$7vq$1@shakotay.alphanet.ch>,
Antoine Leca <root@localhost.invalid> écrit:
6.5p5 revient à dire que le résultat de A*B a un comportement
indéfini, car il est en dehors des valeurs représentables pour le
type unsigned int (dans le cas général) ; même punition pour
UINT_MAX+1 ou -1u ;
Pourquoi UINT_MAX+1 est-il du comportement indéfini? Il n'y a pas
d'overflow sur du ***non signé***.
Alors je ne comprends pas.
Je ne suis pas d'accord avec ta logique, que je lis comme : il
existe au moins une expression constante pour laquelle un
compilateur peut se permettre de ne pas calculer la valeur au moment
de la compilation, donc il n'est pas obligé de savoir faire
l'évaluation des expressions constantes.
Pas de *toutes* les expressions constantes. [Attention à la négation
du "pour tout".]
Pourtant Charlie a dit:
le compilateur est obligé de savoir faire l'évaluation des
expressions constantes au moment de la compilation, sinon impossible
de déclarer ``char a[A * B]''.
Moi je dis:
Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
expressions constantes, il n'est pas forcément impossible de
déclarer ``char a[A * B]''.
Cela revient au même au niveau de la sémantique, mais pas au niveau
du temps de calcul (même si la norme ne se préoccupe pas du temps
de calcul, cette question d'implémentation était dans la question
initiale).
Alors comment ça se fait que lorsque la contrainte 6.6#4 "Each
constant expression shall evaluate to a constant that is in the
range of representable values for its type." est violée, gcc
n'émet pas toujours un diagnostic? Bug?
Dans l'article <gggk09$7vq$,
Antoine Leca écrit:6.5p5 revient à dire que le résultat de A*B a un comportement
indéfini, car il est en dehors des valeurs représentables pour le
type unsigned int (dans le cas général) ; même punition pour
UINT_MAX+1 ou -1u ;
Pourquoi UINT_MAX+1 est-il du comportement indéfini? Il n'y a pas
d'overflow sur du ***non signé***.
Alors je ne comprends pas.
Je ne suis pas d'accord avec ta logique, que je lis comme : il
existe au moins une expression constante pour laquelle un
compilateur peut se permettre de ne pas calculer la valeur au moment
de la compilation, donc il n'est pas obligé de savoir faire
l'évaluation des expressions constantes.
Pas de *toutes* les expressions constantes. [Attention à la négation
du "pour tout".]
Pourtant Charlie a dit:le compilateur est obligé de savoir faire l'évaluation des
expressions constantes au moment de la compilation, sinon impossible
de déclarer ``char a[A * B]''.
Moi je dis:
Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
expressions constantes, il n'est pas forcément impossible de
déclarer ``char a[A * B]''.
Cela revient au même au niveau de la sémantique, mais pas au niveau
du temps de calcul (même si la norme ne se préoccupe pas du temps
de calcul, cette question d'implémentation était dans la question
initiale).
Alors comment ça se fait que lorsque la contrainte 6.6#4 "Each
constant expression shall evaluate to a constant that is in the
range of representable values for its type." est violée, gcc
n'émet pas toujours un diagnostic? Bug?
En news:20081125164122$, Vincent Lefevre va
escriure:
> Dans l'article <gggk09$7vq$,
> Antoine Leca écrit:
>
>> 6.5p5 revient à dire que le résultat de A*B a un comportement
>> indéfini, car il est en dehors des valeurs représentables pour le
>> type unsigned int (dans le cas général) ; même punition pour
>> UINT_MAX+1 ou -1u ;
>
> Pourquoi UINT_MAX+1 est-il du comportement indéfini? Il n'y a pas
> d'overflow sur du ***non signé***.
En vertu de quoi ?
> Alors je ne comprends pas.
Moi non plus.
Si je lis 6.5p5 (sans considérer 6.3), le résultat brut d'une opération hors
du domaine des valeurs représentables aurait un comportement indéfini.
>> Je ne suis pas d'accord avec ta logique, que je lis comme : il
>> existe au moins une expression constante pour laquelle un
>> compilateur peut se permettre de ne pas calculer la valeur au moment
>> de la compilation, donc il n'est pas obligé de savoir faire
>> l'évaluation des expressions constantes.
>
> Pas de *toutes* les expressions constantes. [Attention à la négation
> du "pour tout".]
Seul souci, je ne localise pas le « pour tout » dans ce fil non plus
(décidément, ce mois-ci on dirait que j'ai du mal avec les mathématiques).
> Pourtant Charlie a dit:
>> le compilateur est obligé de savoir faire l'évaluation des
>> expressions constantes au moment de la compilation, sinon impossible
>> de déclarer ``char a[A * B]''.
>
> Moi je dis:
> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
> expressions constantes, il n'est pas forcément impossible de
> déclarer ``char a[A * B]''.
Donc vous dites deux choses deux choses distinctes : Chqrlie que le
compilateur _doit_ savoir évaluer [certaines] expressions, et toi qu'il lui
est loisible de ne pas les évaluer _toutes_.
> Alors comment ça se fait que lorsque la contrainte 6.6#4 "Each
> constant expression shall evaluate to a constant that is in the
> range of representable values for its type." est violée, gcc
> n'émet pas toujours un diagnostic? Bug?
http://www.open-std.org/JTC1/SC22/WG14/www/docs/dr_261.htm répond-t-il à ta
question ?
En news:20081125164122$0a46@prunille.vinc17.org, Vincent Lefevre va
escriure:
> Dans l'article <gggk09$7vq$1@shakotay.alphanet.ch>,
> Antoine Leca <root@localhost.invalid> écrit:
>
>> 6.5p5 revient à dire que le résultat de A*B a un comportement
>> indéfini, car il est en dehors des valeurs représentables pour le
>> type unsigned int (dans le cas général) ; même punition pour
>> UINT_MAX+1 ou -1u ;
>
> Pourquoi UINT_MAX+1 est-il du comportement indéfini? Il n'y a pas
> d'overflow sur du ***non signé***.
En vertu de quoi ?
> Alors je ne comprends pas.
Moi non plus.
Si je lis 6.5p5 (sans considérer 6.3), le résultat brut d'une opération hors
du domaine des valeurs représentables aurait un comportement indéfini.
>> Je ne suis pas d'accord avec ta logique, que je lis comme : il
>> existe au moins une expression constante pour laquelle un
>> compilateur peut se permettre de ne pas calculer la valeur au moment
>> de la compilation, donc il n'est pas obligé de savoir faire
>> l'évaluation des expressions constantes.
>
> Pas de *toutes* les expressions constantes. [Attention à la négation
> du "pour tout".]
Seul souci, je ne localise pas le « pour tout » dans ce fil non plus
(décidément, ce mois-ci on dirait que j'ai du mal avec les mathématiques).
> Pourtant Charlie a dit:
>> le compilateur est obligé de savoir faire l'évaluation des
>> expressions constantes au moment de la compilation, sinon impossible
>> de déclarer ``char a[A * B]''.
>
> Moi je dis:
> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
> expressions constantes, il n'est pas forcément impossible de
> déclarer ``char a[A * B]''.
Donc vous dites deux choses deux choses distinctes : Chqrlie que le
compilateur _doit_ savoir évaluer [certaines] expressions, et toi qu'il lui
est loisible de ne pas les évaluer _toutes_.
> Alors comment ça se fait que lorsque la contrainte 6.6#4 "Each
> constant expression shall evaluate to a constant that is in the
> range of representable values for its type." est violée, gcc
> n'émet pas toujours un diagnostic? Bug?
http://www.open-std.org/JTC1/SC22/WG14/www/docs/dr_261.htm répond-t-il à ta
question ?
En news:20081125164122$, Vincent Lefevre va
escriure:
> Dans l'article <gggk09$7vq$,
> Antoine Leca écrit:
>
>> 6.5p5 revient à dire que le résultat de A*B a un comportement
>> indéfini, car il est en dehors des valeurs représentables pour le
>> type unsigned int (dans le cas général) ; même punition pour
>> UINT_MAX+1 ou -1u ;
>
> Pourquoi UINT_MAX+1 est-il du comportement indéfini? Il n'y a pas
> d'overflow sur du ***non signé***.
En vertu de quoi ?
> Alors je ne comprends pas.
Moi non plus.
Si je lis 6.5p5 (sans considérer 6.3), le résultat brut d'une opération hors
du domaine des valeurs représentables aurait un comportement indéfini.
>> Je ne suis pas d'accord avec ta logique, que je lis comme : il
>> existe au moins une expression constante pour laquelle un
>> compilateur peut se permettre de ne pas calculer la valeur au moment
>> de la compilation, donc il n'est pas obligé de savoir faire
>> l'évaluation des expressions constantes.
>
> Pas de *toutes* les expressions constantes. [Attention à la négation
> du "pour tout".]
Seul souci, je ne localise pas le « pour tout » dans ce fil non plus
(décidément, ce mois-ci on dirait que j'ai du mal avec les mathématiques).
> Pourtant Charlie a dit:
>> le compilateur est obligé de savoir faire l'évaluation des
>> expressions constantes au moment de la compilation, sinon impossible
>> de déclarer ``char a[A * B]''.
>
> Moi je dis:
> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
> expressions constantes, il n'est pas forcément impossible de
> déclarer ``char a[A * B]''.
Donc vous dites deux choses deux choses distinctes : Chqrlie que le
compilateur _doit_ savoir évaluer [certaines] expressions, et toi qu'il lui
est loisible de ne pas les évaluer _toutes_.
> Alors comment ça se fait que lorsque la contrainte 6.6#4 "Each
> constant expression shall evaluate to a constant that is in the
> range of representable values for its type." est violée, gcc
> n'émet pas toujours un diagnostic? Bug?
http://www.open-std.org/JTC1/SC22/WG14/www/docs/dr_261.htm répond-t-il à ta
question ?
En news:20081125164122$, Vincent Lefevre va
escriure:Dans l'article <gggk09$7vq$,
Antoine Leca écrit:6.5p5 revient à dire que le résultat de A*B a un comportement
indéfini, car il est en dehors des valeurs représentables pour le
type unsigned int (dans le cas général) ; même punition pour
UINT_MAX+1 ou -1u ;
Pourquoi UINT_MAX+1 est-il du comportement indéfini? Il n'y a pas
d'overflow sur du ***non signé***.
En vertu de quoi ?
Alors je ne comprends pas.
Moi non plus.
Si je lis 6.5p5 (sans considérer 6.3), le résultat brut d'une opération
hors
du domaine des valeurs représentables aurait un comportement indéfini.
UINT_MAX+1 est en dehors du domaine des valeurs représentables pour un
unsigned int. -1 non plus ne fait pas partie de ces valeurs.
Pourtant Charlie a dit:le compilateur est obligé de savoir faire l'évaluation des
expressions constantes au moment de la compilation, sinon impossible
de déclarer ``char a[A * B]''.
Moi je dis:
Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
expressions constantes, il n'est pas forcément impossible de
déclarer ``char a[A * B]''.
Donc vous dites deux choses deux choses distinctes : Chqrlie que le
compilateur _doit_ savoir évaluer [certaines] expressions, et toi qu'il
lui
est loisible de ne pas les évaluer _toutes_.
En news:20081125164122$0a46@prunille.vinc17.org, Vincent Lefevre va
escriure:
Dans l'article <gggk09$7vq$1@shakotay.alphanet.ch>,
Antoine Leca <root@localhost.invalid> écrit:
6.5p5 revient à dire que le résultat de A*B a un comportement
indéfini, car il est en dehors des valeurs représentables pour le
type unsigned int (dans le cas général) ; même punition pour
UINT_MAX+1 ou -1u ;
Pourquoi UINT_MAX+1 est-il du comportement indéfini? Il n'y a pas
d'overflow sur du ***non signé***.
En vertu de quoi ?
Alors je ne comprends pas.
Moi non plus.
Si je lis 6.5p5 (sans considérer 6.3), le résultat brut d'une opération
hors
du domaine des valeurs représentables aurait un comportement indéfini.
UINT_MAX+1 est en dehors du domaine des valeurs représentables pour un
unsigned int. -1 non plus ne fait pas partie de ces valeurs.
Pourtant Charlie a dit:
le compilateur est obligé de savoir faire l'évaluation des
expressions constantes au moment de la compilation, sinon impossible
de déclarer ``char a[A * B]''.
Moi je dis:
Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
expressions constantes, il n'est pas forcément impossible de
déclarer ``char a[A * B]''.
Donc vous dites deux choses deux choses distinctes : Chqrlie que le
compilateur _doit_ savoir évaluer [certaines] expressions, et toi qu'il
lui
est loisible de ne pas les évaluer _toutes_.
En news:20081125164122$, Vincent Lefevre va
escriure:Dans l'article <gggk09$7vq$,
Antoine Leca écrit:6.5p5 revient à dire que le résultat de A*B a un comportement
indéfini, car il est en dehors des valeurs représentables pour le
type unsigned int (dans le cas général) ; même punition pour
UINT_MAX+1 ou -1u ;
Pourquoi UINT_MAX+1 est-il du comportement indéfini? Il n'y a pas
d'overflow sur du ***non signé***.
En vertu de quoi ?
Alors je ne comprends pas.
Moi non plus.
Si je lis 6.5p5 (sans considérer 6.3), le résultat brut d'une opération
hors
du domaine des valeurs représentables aurait un comportement indéfini.
UINT_MAX+1 est en dehors du domaine des valeurs représentables pour un
unsigned int. -1 non plus ne fait pas partie de ces valeurs.
Pourtant Charlie a dit:le compilateur est obligé de savoir faire l'évaluation des
expressions constantes au moment de la compilation, sinon impossible
de déclarer ``char a[A * B]''.
Moi je dis:
Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
expressions constantes, il n'est pas forcément impossible de
déclarer ``char a[A * B]''.
Donc vous dites deux choses deux choses distinctes : Chqrlie que le
compilateur _doit_ savoir évaluer [certaines] expressions, et toi qu'il
lui
est loisible de ne pas les évaluer _toutes_.
"Antoine Leca" a écrit dans le message de news:
ggk7bl$j5e$
> En news:20081125164122$, Vincent Lefevre va
> escriure:
>> Dans l'article <gggk09$7vq$,
>> Antoine Leca écrit:
...
>> Pourtant Charlie a dit:
>>> le compilateur est obligé de savoir faire l'évaluation des
>>> expressions constantes au moment de la compilation, sinon impossible
>>> de déclarer ``char a[A * B]''.
>>
>> Moi je dis:
>> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
>> expressions constantes, il n'est pas forcément impossible de
>> déclarer ``char a[A * B]''.
>
> Donc vous dites deux choses deux choses distinctes : Chqrlie que
> le compilateur _doit_ savoir évaluer [certaines] expressions, et
> toi qu'il lui est loisible de ne pas les évaluer _toutes_.
En fait la deuxième affirmation est mal formulée : "un compilateur qui ne
sait pas faire l'évaluation de toutes les expressions contantes" ne me
semble pas conforme à la norme,
en revanche rien n'oblige un compilateur conforme à faire
l'évaluation des expressions constantes à la compilation dans les
cas où cela n'est pas nécessaire pour compiler du code conforme,
mais que gagnerait le compilateur à ne pas faire cette optimisation
simple ?
"Antoine Leca" <root@localhost.invalid> a écrit dans le message de news:
ggk7bl$j5e$1@shakotay.alphanet.ch...
> En news:20081125164122$0a46@prunille.vinc17.org, Vincent Lefevre va
> escriure:
>> Dans l'article <gggk09$7vq$1@shakotay.alphanet.ch>,
>> Antoine Leca <root@localhost.invalid> écrit:
...
>> Pourtant Charlie a dit:
>>> le compilateur est obligé de savoir faire l'évaluation des
>>> expressions constantes au moment de la compilation, sinon impossible
>>> de déclarer ``char a[A * B]''.
>>
>> Moi je dis:
>> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
>> expressions constantes, il n'est pas forcément impossible de
>> déclarer ``char a[A * B]''.
>
> Donc vous dites deux choses deux choses distinctes : Chqrlie que
> le compilateur _doit_ savoir évaluer [certaines] expressions, et
> toi qu'il lui est loisible de ne pas les évaluer _toutes_.
En fait la deuxième affirmation est mal formulée : "un compilateur qui ne
sait pas faire l'évaluation de toutes les expressions contantes" ne me
semble pas conforme à la norme,
en revanche rien n'oblige un compilateur conforme à faire
l'évaluation des expressions constantes à la compilation dans les
cas où cela n'est pas nécessaire pour compiler du code conforme,
mais que gagnerait le compilateur à ne pas faire cette optimisation
simple ?
"Antoine Leca" a écrit dans le message de news:
ggk7bl$j5e$
> En news:20081125164122$, Vincent Lefevre va
> escriure:
>> Dans l'article <gggk09$7vq$,
>> Antoine Leca écrit:
...
>> Pourtant Charlie a dit:
>>> le compilateur est obligé de savoir faire l'évaluation des
>>> expressions constantes au moment de la compilation, sinon impossible
>>> de déclarer ``char a[A * B]''.
>>
>> Moi je dis:
>> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
>> expressions constantes, il n'est pas forcément impossible de
>> déclarer ``char a[A * B]''.
>
> Donc vous dites deux choses deux choses distinctes : Chqrlie que
> le compilateur _doit_ savoir évaluer [certaines] expressions, et
> toi qu'il lui est loisible de ne pas les évaluer _toutes_.
En fait la deuxième affirmation est mal formulée : "un compilateur qui ne
sait pas faire l'évaluation de toutes les expressions contantes" ne me
semble pas conforme à la norme,
en revanche rien n'oblige un compilateur conforme à faire
l'évaluation des expressions constantes à la compilation dans les
cas où cela n'est pas nécessaire pour compiler du code conforme,
mais que gagnerait le compilateur à ne pas faire cette optimisation
simple ?
"Antoine Leca" a écrit dans le message de news:
ggk7bl$j5e$
> En news:20081125164122$, Vincent Lefevre va
> escriure:
>> Dans l'article <gggk09$7vq$,
>> Antoine Leca écrit:
...
>> Pourtant Charlie a dit:
>>> le compilateur est obligé de savoir faire l'évaluation des
>>> expressions constantes au moment de la compilation, sinon impossible
>>> de déclarer ``char a[A * B]''.
>>
>> Moi je dis:
>> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
>> expressions constantes, il n'est pas forcément impossible de
>> déclarer ``char a[A * B]''.
>
> Donc vous dites deux choses deux choses distinctes : Chqrlie que
> le compilateur _doit_ savoir évaluer [certaines] expressions, et
> toi qu'il lui est loisible de ne pas les évaluer _toutes_.
En fait la deuxième affirmation est mal formulée : "un compilateur qui ne
sait pas faire l'évaluation de toutes les expressions contantes" ne me
semble pas conforme à la norme,
en revanche rien n'oblige un compilateur conforme à faire
l'évaluation des expressions constantes à la compilation dans les
cas où cela n'est pas nécessaire pour compiler du code conforme,
mais que gagnerait le compilateur à ne pas faire cette optimisation
simple ?
"Antoine Leca" <root@localhost.invalid> a écrit dans le message de news:
ggk7bl$j5e$1@shakotay.alphanet.ch...
> En news:20081125164122$0a46@prunille.vinc17.org, Vincent Lefevre va
> escriure:
>> Dans l'article <gggk09$7vq$1@shakotay.alphanet.ch>,
>> Antoine Leca <root@localhost.invalid> écrit:
...
>> Pourtant Charlie a dit:
>>> le compilateur est obligé de savoir faire l'évaluation des
>>> expressions constantes au moment de la compilation, sinon impossible
>>> de déclarer ``char a[A * B]''.
>>
>> Moi je dis:
>> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
>> expressions constantes, il n'est pas forcément impossible de
>> déclarer ``char a[A * B]''.
>
> Donc vous dites deux choses deux choses distinctes : Chqrlie que
> le compilateur _doit_ savoir évaluer [certaines] expressions, et
> toi qu'il lui est loisible de ne pas les évaluer _toutes_.
En fait la deuxième affirmation est mal formulée : "un compilateur qui ne
sait pas faire l'évaluation de toutes les expressions contantes" ne me
semble pas conforme à la norme,
en revanche rien n'oblige un compilateur conforme à faire
l'évaluation des expressions constantes à la compilation dans les
cas où cela n'est pas nécessaire pour compiler du code conforme,
mais que gagnerait le compilateur à ne pas faire cette optimisation
simple ?
"Antoine Leca" a écrit dans le message de news:
ggk7bl$j5e$
> En news:20081125164122$, Vincent Lefevre va
> escriure:
>> Dans l'article <gggk09$7vq$,
>> Antoine Leca écrit:
...
>> Pourtant Charlie a dit:
>>> le compilateur est obligé de savoir faire l'évaluation des
>>> expressions constantes au moment de la compilation, sinon impossible
>>> de déclarer ``char a[A * B]''.
>>
>> Moi je dis:
>> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
>> expressions constantes, il n'est pas forcément impossible de
>> déclarer ``char a[A * B]''.
>
> Donc vous dites deux choses deux choses distinctes : Chqrlie que
> le compilateur _doit_ savoir évaluer [certaines] expressions, et
> toi qu'il lui est loisible de ne pas les évaluer _toutes_.
En fait la deuxième affirmation est mal formulée : "un compilateur qui ne
sait pas faire l'évaluation de toutes les expressions contantes" ne me
semble pas conforme à la norme,
en revanche rien n'oblige un compilateur conforme à faire
l'évaluation des expressions constantes à la compilation dans les
cas où cela n'est pas nécessaire pour compiler du code conforme,
mais que gagnerait le compilateur à ne pas faire cette optimisation
simple ?
> Alors comment ça se fait que lorsque la contrainte 6.6#4 "Each
> constant expression shall evaluate to a constant that is in the
> range of representable values for its type." est violée, gcc
> n'émet pas toujours un diagnostic? Bug?
http://www.open-std.org/JTC1/SC22/WG14/www/docs/dr_261.htm répond-t-il à ta
question ?
> Alors comment ça se fait que lorsque la contrainte 6.6#4 "Each
> constant expression shall evaluate to a constant that is in the
> range of representable values for its type." est violée, gcc
> n'émet pas toujours un diagnostic? Bug?
http://www.open-std.org/JTC1/SC22/WG14/www/docs/dr_261.htm répond-t-il à ta
question ?
> Alors comment ça se fait que lorsque la contrainte 6.6#4 "Each
> constant expression shall evaluate to a constant that is in the
> range of representable values for its type." est violée, gcc
> n'émet pas toujours un diagnostic? Bug?
http://www.open-std.org/JTC1/SC22/WG14/www/docs/dr_261.htm répond-t-il à ta
question ?
Dans l'article <ggpeii$6ld$,
Charlie Gordon écrit:"Antoine Leca" a écrit dans le message de news:
ggk7bl$j5e$
> En news:20081125164122$, Vincent Lefevre va
> escriure:
>> Dans l'article <gggk09$7vq$,
>> Antoine Leca écrit:...
>> Pourtant Charlie a dit:
>>> le compilateur est obligé de savoir faire l'évaluation des
>>> expressions constantes au moment de la compilation, sinon impossible
>>> de déclarer ``char a[A * B]''.
>>
>> Moi je dis:
>> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
>> expressions constantes, il n'est pas forcément impossible de
>> déclarer ``char a[A * B]''.
>
> Donc vous dites deux choses deux choses distinctes : Chqrlie que
> le compilateur _doit_ savoir évaluer [certaines] expressions, et
> toi qu'il lui est loisible de ne pas les évaluer _toutes_.En fait la deuxième affirmation est mal formulée : "un compilateur qui ne
sait pas faire l'évaluation de toutes les expressions contantes" ne me
semble pas conforme à la norme,
Je ne suis pas d'accord. De toute façon, je me rends compte maintenant
que c'est stupide: dans la pratique, aucun compilateur ne sait évaluer
toutes les expressions constantes, car on peut toujours lui fournir
quelque chose de tellement compliqué qu'on va faire exploser les
limites de la machine. :) (Et aucune implémentation n'est évidemment
requise de traduire tout programme conforme.)
Dans l'article <ggpeii$6ld$1@news.motzarella.org>,
Charlie Gordon <news@chqrlie.org> écrit:
"Antoine Leca" <root@localhost.invalid> a écrit dans le message de news:
ggk7bl$j5e$1@shakotay.alphanet.ch...
> En news:20081125164122$0a46@prunille.vinc17.org, Vincent Lefevre va
> escriure:
>> Dans l'article <gggk09$7vq$1@shakotay.alphanet.ch>,
>> Antoine Leca <root@localhost.invalid> écrit:
...
>> Pourtant Charlie a dit:
>>> le compilateur est obligé de savoir faire l'évaluation des
>>> expressions constantes au moment de la compilation, sinon impossible
>>> de déclarer ``char a[A * B]''.
>>
>> Moi je dis:
>> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
>> expressions constantes, il n'est pas forcément impossible de
>> déclarer ``char a[A * B]''.
>
> Donc vous dites deux choses deux choses distinctes : Chqrlie que
> le compilateur _doit_ savoir évaluer [certaines] expressions, et
> toi qu'il lui est loisible de ne pas les évaluer _toutes_.
En fait la deuxième affirmation est mal formulée : "un compilateur qui ne
sait pas faire l'évaluation de toutes les expressions contantes" ne me
semble pas conforme à la norme,
Je ne suis pas d'accord. De toute façon, je me rends compte maintenant
que c'est stupide: dans la pratique, aucun compilateur ne sait évaluer
toutes les expressions constantes, car on peut toujours lui fournir
quelque chose de tellement compliqué qu'on va faire exploser les
limites de la machine. :) (Et aucune implémentation n'est évidemment
requise de traduire tout programme conforme.)
Dans l'article <ggpeii$6ld$,
Charlie Gordon écrit:"Antoine Leca" a écrit dans le message de news:
ggk7bl$j5e$
> En news:20081125164122$, Vincent Lefevre va
> escriure:
>> Dans l'article <gggk09$7vq$,
>> Antoine Leca écrit:...
>> Pourtant Charlie a dit:
>>> le compilateur est obligé de savoir faire l'évaluation des
>>> expressions constantes au moment de la compilation, sinon impossible
>>> de déclarer ``char a[A * B]''.
>>
>> Moi je dis:
>> Avec un compilateur qui ne sait pas faire l'évaluation de toutes les
>> expressions constantes, il n'est pas forcément impossible de
>> déclarer ``char a[A * B]''.
>
> Donc vous dites deux choses deux choses distinctes : Chqrlie que
> le compilateur _doit_ savoir évaluer [certaines] expressions, et
> toi qu'il lui est loisible de ne pas les évaluer _toutes_.En fait la deuxième affirmation est mal formulée : "un compilateur qui ne
sait pas faire l'évaluation de toutes les expressions contantes" ne me
semble pas conforme à la norme,
Je ne suis pas d'accord. De toute façon, je me rends compte maintenant
que c'est stupide: dans la pratique, aucun compilateur ne sait évaluer
toutes les expressions constantes, car on peut toujours lui fournir
quelque chose de tellement compliqué qu'on va faire exploser les
limites de la machine. :) (Et aucune implémentation n'est évidemment
requise de traduire tout programme conforme.)