Domanda

Ho una semplice domanda che sto posavo per lo più per la mia curiosità.

Quali sono le differenze tra queste due righe di codice? (In C ++)

for(int i = 0; i < N, N > 0; i++)

for(int i = 0; i < N && N > 0; i++)

La selezione delle condizioni è del tutto arbitrario, io sono solo interessati alle differenze tra, e &&.

Io non sono un principiante di codifica con qualsiasi mezzo, ma non ho mai preso la briga con l'operatore virgola.

Vi sono differenze di prestazioni / comportamento o è puramente estetica?

Un'ultima nota, so che ci sono pesci più grandi prestazioni per friggere che un operatore condizionale, ma io sono solo curioso. mi indulgere.

Modifica Grazie per le vostre risposte.

Si scopre il codice che ha spinto a questa domanda aveva abusato l'operatore virgola nel modo che ho descritto. Mi chiedevo quale fosse la differenza e perché non era un operatore di &&, ma era solo scritto in modo errato. Non pensavo che ci fosse qualcosa di sbagliato con esso, perché ha funzionato bene. Grazie per avermi raddrizzare fuori.

È stato utile?

Soluzione

Anche se sembra che,

for(int i = 0; i < N, N > 0; i++)

e

for(int i = 0; i < N && N > 0; i++) 

non sono equivalenti.

Ecco la prova.

int main(int argc, char* argv[])
{
  int N = 10;
  int i = 5;

  int val = (N, i);
  cout << val << endl;
}

Risultato:

5

Il che significa che il momento di determinare quando il loop uscirà userà N > 0. Se N = 10, questo significa che sarà sempre vero e il ciclo non sarà mai uscita.

Esegui questo e vedere la prova.

int main(int argc, char* argv[])
{
  int N = 10;
  int i = 5;

  for(int i = 0; i < N, N > 0; i++){
     cout << val << endl;
  }
}

bash-2.05$ ./a.out                  
0                                   
1                                   
2                                   
3                                   
4                                   
5                                   
6                                   
7                                   
8                                   
9                                   
10                                  
11                                  
...
142
143
144
145
146
147
148
^C

Se N è una costante o variabile che non cambia all'interno del ciclo allora si può solo rimuovere il controllo N > 0 controllando una volta prima, cioè.

if (N > 0){
  for (int i = 0; i < N; i++)
   ...
}

Altri suggerimenti

Utilizzando una virgola simile verrà semplicemente scartare la prima condizione .

L'operatore virgola significa "correre queste dichiarazioni in questo ordine, e prendere il valore del l'ultimo".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top