Boucle infinie en C

Quel est la différence entre :

et

?

c’est un peu comme la diffrerence entre un pigeon.
aucune. excepté que y’a un code qui fait pas comme l’autre. :smiley:

(pas la peine de mettre le 1 dans le while())

le truc entre for et while, c’est que pour while le test est effectué avant le {}, alors que pour le for , le test est effectué après le {};

While est souvent utilisé lorsque l’on ne connaît pas la valeur de l’incrémentation un exemple sera plus parlant

#include<stdio.h> #include <stdlib.h> int main(void){ int x=0; while(x < 30){ x=x+(int) (10.0*rand()/(RAND_MAX+1.0)); printf("Dans la boucle while : \n %d\n",x); } for(x=0; x<10; x++){ printf("Dans la boucle for : \n %d\n",x); } return 0; }

23:37 (ed~equinoxe) /home/ed
% cat t1.c                                                       [2.20 2.31 - ]
main(){while(1);}
23:37 (ed~equinoxe) /home/ed
% cat t2.c                                                       [2.18 2.30 - ]
main(){for(;;);}
23:37 (ed~equinoxe) /home/ed
% gcc -S t2.c -o t2.s                                            [2.28 2.32 - ]
23:37 (ed~equinoxe) /home/ed
% gcc -S t1.c -o t1.s                                            [2.26 2.31 - ]
23:37 (ed~equinoxe) /home/ed
% diff t2.s t1.s                                                 [2.32 2.32 - ]
1c1
<       .file   "t2.c"
---
>       .file   "t1.c"

Conclusion: AUCUNE différence :stuck_out_tongue:

while est plus classique pour une sortie à condition, il me semble.
for est plutôt réservé au sorties définies ds la ligne.
la boucle n’est pas “infinie” comme le dit ton titre puis qu’il y a tjrs une sortie de prévue. :laughing:

Je suis d’accord ed mais au niveau du codage pour certaines utilisations, il est plus facile d’utiliser l’une ou l’autre même si après le compilateur en fait la même chose. Faudrait voir à quel niveau il parlait de la différence.

Je voulais juste savoir quel était la meilleure boncle infinie, si c’est la même chose je vais alors rester sur un while (1); :slightly_smiling:

t’es louche toi ? c’est bete de mettre while(1) alors que tu veux pas écrire for(;;1)… soit cohérent l’ami !

je crois bien que j’écris while(), while(true); mais jamaix while(1); en plus ça me parait syntaxiquement faux, parce que si tu fait !1 bah ça devient pas false… !1 != 0x000000

while(1)… bon après c’est question de gout, mais ça me fait penser à du mauvais C, parce que y’a pas le type bool, et que j’ai fait des hallergies répétitives au C tout au long de ma carrière informatique…

bon c’est vrai que true n’existe que en C++… mais fais toi des define TRUE et FALSE, qui doivent exister aussi dans certainement librairie. c’est quand même plus lisible.

je prefère insister maintenant au début… parce que des manière d’ecrire du code incomprehensible, y’a a des tonnes… et c’est beaucoup plus facile à écrire que du code compréhensible.

moi pinailleur ?

quote="Anoyzthen"
je crois bien que j’écris while(), while(true); mais jamaix while(1); (…)[/quote]Alors jamais un de tes programmes C ne compile ?

roc@roc:~$ cd devel/ roc@roc:~/devel$ echo "main(){while();}" >t0.c roc@roc:~/devel$ make t0 cc t0.c -o t0 t0.c: In function ‘main’: t0.c:1: error: expected expression before ‘)’ token make: *** [t0] Erreur 1 roc@roc:~/devel$ echo "main(){while(1);}" >t0.c roc@roc:~/devel$ make t0 cc t0.c -o t0 roc@roc:~/devel$ echo "main(){while(true);}" >t0.c roc@roc:~/devel$ make t0 cc t0.c -o t0 t0.c: In function ‘main’: t0.c:1: error: ‘true’ undeclared (first use in this function) t0.c:1: error: (Each undeclared identifier is reported only once t0.c:1: error: for each function it appears in.) make: *** [t0] Erreur 1Par contre, si c’est du c++:

roc@roc:~/devel$ rm t0.c roc@roc:~/devel$ echo "main(){while();}" >t0.cc roc@roc:~/devel$ make t0 g++ t0.cc -o t0 t0.cc: In function ‘int main()’: t0.cc:1: error: expected primary-expression before ‘)’ token make: *** [t0] Erreur 1 roc@roc:~/devel$ echo "main(){while(1);}" >t0.cc roc@roc:~/devel$ make t0 g++ t0.cc -o t0 roc@roc:~/devel$ echo "main(){while(true);}" >t0.cc roc@roc:~/devel$ make t0 g++ t0.cc -o t0Le true fonctionne, mais pas le while();
A pinailleur, pinailleur et demi :laughing:

Je comprends pas pourquoi exécuter l’instruction 1 à chaque boucle.
À la rigueur il faudrais écrire for (:1;) mais ça me semble plus logique est plus simple d’écrire while (1) :unamused:

Pour ce qui est des defines tu as raison c’est plus lisible mais il faudrais que je les réécrivent dans chque exemple que je donne.

jamais j’écris de boucle infinie, trop risqué par rapport aux developpemtn que je faisais. la dernière fois que j’ai fait une boucle infinie de la sorte c’était y’a longtemps ( 3 ans ) et c’était pour débugger du C à la va vite.

Demi pinailleur, pour moi ça devient un chieur… mais si c’est moi qu’est en question… ah ah… je vais etre plus clément :slightly_smiling:

Sinon pour ce qui est du C, sous windows, le windows.h defini TRUE et FALSE. peut etre pas C standard, mais face à une vrai lacune du C, bah j’utilisais ça. et quiconque peut se faire deux define pour les deux bouleens. on va dire que je prefère ça.

[quote=“Anoyzthen”]t’es louche toi ? c’est bete de mettre while(1) alors que tu veux pas écrire for(;;1)… soit cohérent l’ami !

je crois bien que j’écris while(), while(true); mais jamaix while(1); en plus ça me parait syntaxiquement faux, parce que si tu fait !1 bah ça devient pas false… !1 != 0x000000

while(1)… bon après c’est question de gout, mais ça me fait penser à du mauvais C, parce que y’a pas le type bool, et que j’ai fait des hallergies répétitives au C tout au long de ma carrière informatique…
[/quote]

C’est completement faux.

!1 c’est 0.

Et pour le while:

while(); ça ne fonctionnera PAS. for(;:wink: oui. Eh oui, for(;;1) c’est idiot car le 1 ne sert absolument a rien.

et tu fais quoi dans ton define ?

#define TRUE 1
#define FALSE 0

… CQFD.

[quote]
je prefère insister maintenant au début… parce que des manière d’ecrire du code incomprehensible, y’a a des tonnes… et c’est beaucoup plus facile à écrire que du code compréhensible.

moi pinailleur ?[/quote]

C’est completement lisible d’écrire while(1), je suis désolé. C’est d’ailleur une des methodes les plus utilisées pour faire une boucle infinie.

bon indépendament de ce que j’ai écrit une grosse betise :

while(1) est lisible par l’initié.
while(TRUE) est lisible par le simple lettré.

c’est pour illustrer le commencement de la dissimulation du fonctionnement du code. j’utilise cet exemple parce qu’il est hyper simple et flagrant. AMHA.

et de tête, je dis ça comme ça, sans vérifier je travaille pas sur les bits depuis 3 ou 4 ans mais je crois que:
! 0x000001 == 0x111110
! 0x000001 != 0x000000
edit: à moins que je confonde avec l’operateur sur les bits.

pour avoir fait les frais de l’hermetisme syntaxique des programmeurs sur un projet faisant des millions de lignes de code… je suis devenu un peu complèment intolérant aux bidouilles d’écriture.

et c’est bien parce que le #define TRUE 1 que c’est plus lisible ensuite décrire while(TRUE)… maintenant c’est sur que sur ce tout petit petit bout de code, on croirait que je %^µ%! dans une pendule :slightly_smiling:

Tu parle du ou binaire, pas du !.

Autre chose le define est remplacé lors de la précompilation, donc ton while(TRUE) est strictement égal a while(1).

Ensuite, si quelqu’un qui lit while(1) ne comprends pas, il n’est pas digne de programmer.

ed, tu veux pas comprendre, alors je te laisse te méprendre.
je vais pas repeter mon illustration 4 fois. c’est mon point de vue libre à toi de te braquer. bats toi contre les #define l’ami… alors que c’est l’encapsulation la plus bas niveau qu’on puisse à peine imaginer… tu dois pas être un tendre avec les intégristes du language objet avancé ?

et si comme tu le dis je confonds ! avec le | alors que dans mon esprit le | est un operateur binaire. je veux vraiment bien que tu m’expliques comment je peux confondre ces deux opérations “!a” et “a | b”

explique moi sérieusement !?
en tout cas ta phrase “n’est pas digne…” c’est d’une tristesse… infinie ! :slightly_smiling:

montre moi le ou binaire unaire ternaire ou de la terre entière qui permet d’arriver à x | 0x000001 == 0x111110
là je t’attends au tournant l’ami :slightly_smiling:

mais bon, j’ai déjà lu des posts de toi, tu as l’air d’etre rude… je suppose ce c’est ton caractère de rentre dedans.
sans rancunes.

edit: c’est plus ou moins possible avec un ou exclusif, que je sais plus écrire en C… hmm ça doit etre une truc comme ^! ou ^| ou ^… pour l’écriture je choisirais ^| mais c’est parce que je m’en souviens pas ! ! ! !:

0x111111 ^| 0x000001 == 0x111110 mais c’est certainement pas ce à quoi tu pensais.

Je veux pas de polémique c’est juste pour montrer la chose sur qui était l’opérateur pour les bits

 !0x02 -> 0x00
 ~0x02 -> 0xFD

ok donc ! en gros c’est le non booléen uniquement, 'tain je savais pas
et ~ c’est donc le non binaire… phiou va falloir que je rebosse ça un jour.

mais !(0x00) ça fait combien ? un chiffre au pif ? ? ? ? ?

TRUE peut-être

bah non puisque TRUE c’est un define… donc 0x01 comme insiste Ed.

dans mon esprit c’état gravé ! == Non Logique… faut que je l’assortisse d’un petit tilde pour les bits.

En fait, je me suis aussi planté au début avec l’utilisation de ! ou ~, mais à force de faire l’erreur ça reste dans la tête.

L’utilsation que j’en fais c’est principalement des trucs du genre :

Pour mettre à 0 dans ledReg la led ou les leds qui sont à 1 dans ledPos.

Un exemple tout bête :p!