1
votes

Comment cette condition if-else peut être remplacée par un opérateur ternaire

S'il vous plaît, aidez-moi à réécrire la condition ci-dessous d'une meilleure manière

Ceci est un code c

 if(a == MACRO1)
 strcpy(x,"S")
else if (a == MACRO2)
 strcpy(x,"K");

c

4 commentaires

Je n'utiliserais probablement pas une expression ternaire ici, car il n'y a pas de condition finale d'autre dans votre logique. J'aime votre code tel qu'il est maintenant.


Qu'est-ce qui vous fait penser que l'utilisation de l'opérateur ternaire serait mieux ici?


BTW strcpy pour un personnage semble assez exagéré; woule vraiment besoin de voir l'exemple de code while


Puisque vous comparez pour l'égalité avec deux valeurs distinctes, plutôt que l'égalité avec une valeur et un cas général "else", l'opérateur ternaire ne convient pas pour cette opération.


6 Réponses :


1
votes
strcpy( x, (a == MACRO1)? "S" :
           (a == MACRO2)? "K" : "error" );
Like your original code, this will copy either "S" or "K" to variable x.If a is neither MACRO1 nor MACRO2, it will copy "error" to buffer x with an assumption that x is large enough to hold "error" string.
(You should figure out a better way to handle the case where a is neither of the two macros)

0 commentaires

4
votes
strcpy(x, (a == MACRO1) ? "S" : ((a == MACRO2) ? "K" : x));

1 commentaires

Avec char * strcpy (char * restrict s1, const char * restrict s2); , les arguments référencés les données de strcpy ne doivent pas se chevaucher est vrai, sinon UB technique selon 6.7.3.1 4, bien que je sois d'accord: problème réel douteux avec strcpy (x, x);



3
votes

En mettant de côté ce belle réponse , cela ne peut pas être écrit comme deux opérateurs conditionnels ternaires "imbriqués" car il n'y a rien à faire pour une valeur de a autre que MACRO1 et MACRO2 , et il n'est pas possible de tromper strcpy dans un no-op. (Le comportement de la copie de x sur lui-même est indéfini .)

Il vaut donc mieux laisser le code tel quel. Notez qu'en termes d'historique de programmation, l'opérateur conditionnel ternaire a été inventé avant le bloc de contrôle if else en raison peut-être des lacunes du premier, comme le montre le cas que vous présentez .

Vous pouvez cependant soumettre

strnpcy(x, a == MACRO1 ? "S" : "K", 2 * (a == MACRO1 + a == MACRO2));

au prochain concours d'obscurcissement.


0 commentaires

-1
votes

cela peut être aussi

{
    char *dummy;

    dummy = a == MACRO1 ? strcpy(x, "TextA") : a == MACRO2 ? strcpy(x, "TextB") : strcpy(x, "error");
}


0 commentaires

4
votes

Formellement, il peut être réécrit comme équivalent

a == MACRO1 ? strcpy(x, "S") : 
a == MACRO2 ? strcpy(x, "K") : 0;

mais il n'y a aucune raison valable de le faire, à moins que ce ne soit juste un casse-tête (ou à moins qu'il y ait une raison crédible de Maintenir la sémantique des expressions ).


0 commentaires

-1
votes

Manière la plus simple, se comportant comme l'original, ne rien ajouter si a ne correspond ni à MACRO1 ni à MACRO2:

strcpy(x, (a == MACRO1)?"S":(a == MACRO2)?"K":x);


3 commentaires

Ce n'est pas comme l'original; il écrase x par la chaîne vide si aucune comparaison ne réussit. Vous pourriez remplacer "" par x , ce qui en ferait au moins une dépense sans opération (ou en fait indéfinie, comme indiqué dans stackoverflow.com/a/54443256/1126841 ).


(Si strcat était utilisé à la place de strcpy , alors "" pourrait être utilisé comme élément d'identité pour un no-op coûteux.)


Fixé! Merci, je l'ai négligé et au début, je pensais que c'était strcat, pas strcpy: D