2015-08-14 15 views
5

sto guardando alcuni codici di esempio e ho visto che qualcuno ha fatto questoCosa per (;;) e while(); Cioè in C

for (;;) { 
// ... 
} 

È che equivale a while(1) { }?

E cosa fa while(condition);? Non capisco il motivo dietro mettendo ';' invece di {}

+0

Il codice è come 'for (;;) {while (condizione); } '. Quindi quei 2 sono semplicemente un ciclo while (condition) {} '? – PTN

+2

'while (condizione);' ha più senso quando si considera che "condizione" potrebbe includere incrementi, decrementi, chiamate di funzione, ecc ... – Dmitri

+0

sì il ciclo è come questo 'while ((buff [n ++] = getchar())! = '\ n'); ' – PTN

risposta

8

sì,

for(;;){} 

è un ciclo infinito

+2

Si noti che questo ciclo [causa un comportamento non definito] (http://stackoverflow.com/questions/2178115/are-compilators-allowed-to-eliminate-infinite-loops/) in C11. (Nel C99 non era chiaro se lo avesse fatto o no). 'while (1) {}' non causa un comportamento indefinito, quindi quei due costrutti di loop non sono gli stessi. –

8

E cosa fa while (condizione); fare? Non capisco il motivo di aver messo ';' invece di {}

Bene, la tua domanda è cosa succede se metti o non metti un punto e virgola dopo quello mentre le condizioni? Il computer identifica il punto e virgola come un'istruzione vuota.

Prova questo:

#include<stdio.h> 

int main(void){ 
    int a = 5, b = 10; 

    if (a < b){ 
     printf("True"); 
    } 


    while (a < b); /* infinite loop */ 
     printf("This print will never execute\n"); 

    return 0; 
} 
+1

L'istruzione vuota dal punto e virgola è il corpo del ciclo. Ma a volte è intenzionale se il lavoro è fatto nella * condizione *. – Dmitri

+1

La stampa può essere eseguita perché "while (a

1

mentre solo loop anche se una singola istruzione fino a quando la condizione è falsa. Non deve essere una dichiarazione composta (questa cosa: {}), può essere qualsiasi affermazione. ; è una dichiarazione che non fa nulla.

while(getchar() != '\n'); 

loop fino a quando non si preme invio, ad esempio. Però, questa è una cattiva pratica dal momento che mangerà il thread; aggiungere una chiamata a un metodo di sospensione nel ciclo è meglio.

0

for(;;) e while(1) sono entrambi i loop infinito, e compilare agli stessi codici operativi:

L2: 
    jmp  L2 

Il che significa che non c'è differenza di velocità, come lo smontaggio è esattamente la stessa.

+2

Intendevi 'per (;;) {}' e 'while (1) {}'? Supponendo che il codice assembly sia solo un possibile risultato, altri sistemi potrebbero differire. –