Question

J'ai une simple question que je me pose surtout pour ma curiosité.

Quelles sont les différences entre ces deux lignes de code? (En C ++)

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

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

La sélection des conditions est tout à fait arbitraire, je suis intéressé par les différences entre et &&.

Je ne suis pas un débutant au codage par tout moyen, mais je ne l'ai jamais pris la peine avec l'opérateur virgule.

Y at-il des différences de performance / ou de comportement est purement esthétique?

Une dernière note, je sais qu'il ya de plus gros poissons de performance à frire qu'un opérateur conditionnel, mais je suis juste curieux. Laissez-vous tenter moi.

Modifier Merci pour vos réponses.

Il se trouve le code qui a poussé cette question avait abusé de l'opérateur virgule dans la façon dont je viens de décrire. Je me suis demandé quelle était la différence et pourquoi il n'a pas été un opérateur &&, mais il était juste écrit de manière incorrecte. Je ne pensais pas que quelque chose était mal avec elle parce qu'elle fonctionnait très bien. Merci de me redresser.

Était-ce utile?

La solution

Bien qu'il ressemble à elle,

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

et

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

ne sont pas équivalents.

Voici la preuve.

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

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

Résultat:

5

Ce qui signifie que le moment de déterminer si la boucle quitte il utilisera N > 0. Si N = 10, cela signifie qu'il sera toujours vrai et la boucle ne sera jamais sortie.

Exécuter cela et voir la preuve.

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

Si N est une constante ou une variable qui ne change pas à l'intérieur de la boucle alors vous pouvez retirer le chèque de N > 0 en cochant une fois d'abord, i.e..

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

Autres conseils

En utilisant une virgule comme ça va simplement Rejeter la première condition .

L'opérateur virgule signifie « exécuter ces instructions dans cet ordre, et de prendre la valeur du dernier ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top