2
votes

Comment convertir if en switch-case en c

if(a > b)
{printf("%d is greater than %d", a, b);}
else if( a < b )
{printf("%d is greater than %d", b, a);}
else
{printf("%d is equal to %d", a, b);}
How do I convert an if statement to a switch-case in C?
I'm trying, but i don't know the answer to this problem 

10 commentaires

Pourquoi est ce que tu veux faire ça? Vous ne pouvez pas (…). Les instructions switch ne peuvent tester que l'égalité.


Ce n'est pas un problème. Ne convertissez rien, c'est absolument parfait tel quel (sauf que ce n'est pas correctement indenté).


Vous pouvez utiliser une construction vraiment étrange comme switch ((a> b) + 10 * (a puis vérifier les valeurs 0, 1, 10. Mais ... NE FAITES PAS CE!


ce n'est pas tout à fait impossible - vous pourriez avoir une instruction case pour chaque valeur entière possible et faire switch (ab) ... mais en ajoutant plusieurs millions de lignes de code, cela peut être fait avec un couple semble être un énorme pas en arrière


Une instruction switch est destinée à sélectionner parmi plusieurs cas en fonction de la valeur d'une variable unique . Vous n'avez pas ce cas. Vous regardez la relation entre deux variables. Vous auriez besoin de convertir cette relation en une valeur unique pour utiliser une instruction switch, mais cela ne vous éviterait rien.


@Gerhardh super idée ^^


@bruno ^^ J'espère que personne n'utilisera jamais un BS aussi fou dans la vraie vie.


@Gerhardh tout est possible, tout. Combien de fois je vois si (...) a = true; sinon a = faux; ...


@bruno, c'est vrai. Un de mes favoris: sprintf (buf, "% s", ""); pour initialiser une chaîne vide. :)


@Gerhardh il y a quelques jours, je vois strcat (s, ""); et l'OP expliquant qui ajoute un caractère nul s'il n'est pas présent (était vraiment strcat , pas strcpy ) ^^


4 Réponses :


7
votes
Les instructions

switch sont utilisées pour tester une expression d'entrée par rapport à un ensemble fini de valeurs possibles.

Vous essayez de comparer deux variables. Ce n'est pas un cas d'utilisation pour switch .

Votre chaîne if / else if est correcte.


1 commentaires

Voté. Félicitations pour ne pas approuver comme (a b) dans expression une partie de switch .



2
votes

blague :

switch ((a > b) ? 1 : ((a == b) ? 0 : -1)) {
case 1:
  printf("%d is greater than %d", a, b);
  break;
case 0:
  printf("%d is equal to %d", a, b);
  break;
default:
  printf("%d is greater than %d", b, a);
}


2 commentaires

soyez prudent en suggérant un code comme celui-ci: vous ne savez jamais qui va lire et en tirer des leçons. :)


@SouravGhosh ^^



5
votes
switch ((a < b) - (a > b)) {
case -1:
    printf("%d is greater than %d", a, b);
    break;
case 1:
    printf("%d is greater than %d", b, a);
    break;
default:
    printf("%d is equal to %d", a, b);
}

9 commentaires

Mais pourquoi diable? :)


true est 1 et false est 0


Belle solution. Si je vois une telle chose dans une revue de code, quelqu'un est partant pour une interdiction de clavier. ;)


@Gerhardh à propos d'une interdiction, quelqu'un a décliné ma réponse, ayant probablement besoin de lunettes pour lire "blague", ou n'aimant pas les blagues? ^^


@Gerhardh J'espère que vous ne rencontrerez jamais rien de tel que while (* dst ++ = * src ++); pendant les révisions de code.


@bruno, votre expression switch est maladroite, cela pourrait être la raison?


@ machine_1 À mon (humble?) avis, l'opérateur <=> de C ++ légitime quelque peu cela.


@Bathsheba bien sûr l'expression est, sinon pas de blague


@MikhailVladimirov Cette version classique d'une ligne de strcpy est beaucoup plus simple.



1
votes

Vous tombez sur une comparaison à trois ici.

Vous pouvez écrire switch ((a b)) { avec -1, 0 et +1 comme étiquettes de cas pour a , a == b et a> b respectivement. Notez que vous avez besoin des parenthèses car le binaire - a une priorité plus élevée que ou >.

En C ++, cette expression a été encapsulé dans l ' opérateur de comparaison à trois voies et vous pouvez écrire simplement

switch (a <=> b){

avec le cas étiquettes comme avant. Pour autant que je sache, il n’est pas proposé d’inclure cet opérateur dans C.


0 commentaires