-2
votes

Comment tester la valeur de retour d'une fonction contre plusieurs valeurs sans stocker une variable

Comment pourrais-je réaliser quelque chose comme ça ... xxx

Cela imprimerait le succès si le retour de F (x) est égal à A ou b. Je sais qu'il est possible de le stocker dans une variable mais ma question est la suivante: "Est-ce que quelque chose comme ça peut être fait en appelant la fonction F (x) une seule une seule une seule fois sans utiliser une variable ?"

EDIT 1: Je n'ai pas autorisé à utiliser la déclaration de commutation Pour cette affectation

EDIT 2: Puis-je définir une plage avec une seule expression comme celle-ci? xxx

serait valide (type de retour est int) ?


11 commentaires

commutateur (f (x)) {case 'a': ... cas 'b': ...} Voir exemple d'utilisation avec sscanf dans Comment lire la ligne de fichier par ligne et obtenir des caractères spécifiques ou des INTS? (sous la position Séparant toutes les valeurs )


Vous pouvez également écrire une fonction auxiliaire: int is_a_or_b (int x) {retour (x == a) || (x == b); } ... si (is_a_or_b (f (x))) {...}


Merci pour votre réponse rapide, mais malheureusement, je ne suis pas autorisé à utiliser la déclaration de commutation.


OK, alors si le retour est Tape char (ou int ) puis utilisez si (Strchr ("AB", F (x)). )


@ DAVIDC.RANKIN Strchr ("AB", F (X)) correspond sur 3 valeurs. Peut-être que memchr () ?


Quel type est a, b et de retour de f () ?


Vous devez partager le texte intégral de l'affectation, non seulement dribbler une fribine à la fois. Et non, vous ne pouvez pas comparer une plage comme celle-là, une plage est vérifiée avec si (2


@ chux-reinstatetemonica err ... Umm ... le caractère nul - bonne prise? memchr c'est.


Pourrais-je définir une plage comme si (2 - non, pas dans C.


La mauvaise nouvelle: vous aurez besoin d'une variable TEMP. La bonne nouvelle: tout compilateur moderne devrait être suffisamment intelligent pour l'optimiser.


Avec plus d'abus C, le code pourrait commencer par quelque chose comme f () * 0x100000000u mais le point est que même si c'est possible , je ne vois pas de manière propre pour le faire sans une variable simplement temporaire.


3 Réponses :


1
votes

Ceci peut évidemment être fait à l'aide d'une instruction de commutation. Une autre façon ferait appeler une fonction de retour true ou false avec la première valeur de fonction comme entrée, une autre manière pourrait être une table de saut, voire même > code> ou la vérification du bit à l'aide des opérateurs binaires en fonction des valeurs A et B (très Comman pour tester plusieurs drapeaux de bits à la fois).

Mais vraiment, vous ne devriez pas vous soucier de l'utilisation ou de l'utilisation d'une variable dans de tels cas. Les compilateurs actuels sont assez bons mettant des variables temporaires comme celle des registres. P>

EDIT: Compte tenu des contraintes, la solution la plus probable utilise un peu FU, mais elle dépend complètement des valeurs d'A et B et C, etc. . La manière commune utilise des pouvoirs de deux comme des valeurs à vérifier. Ensuite, vous pouvez vérifier un ensemble de valeurs dans une seule opération. P>

Exemple: A = 1, B = 2, C = 4 P>

if (f(x) & (1+2+4)) {...}


0 commentaires

2
votes

Comment tester pour plusieurs valeurs de retour d'une fonction appelée une seule fois sans stocker dans une variable (?)

Pas vraiment, mais avec certaines restrictions, laissez-nous abuser c et supposons a, b et f () renvoie un caractère.

1 former un tableau de caractères composé de A et B et recherchez-le à l'aide de MEMCHR () . Inspiré par @ David C. Rankin (il ne stocke pas le résultat de f () dans une variable, mais appelle une fonction) xxx < / PRE>


Je vois SOP ajouté "Type de retour est INT" - OH bien. <<


Si (2 est un code valide, mais ne fait pas ce qui veut.

c'est comme si (((2 qui compare f (x) avec 2 et résulte 0 ou 1, qui est toujours inférieur à 5.


La foule difficile ce soir, alors que diriez-vous de ce qui suit. A besoin d'un peu de mathématique pour int overflow`, mais est proche. xxx


1 pas sérieux Suggestions de code pour le code de production - Utilisez un temporaire.


7 commentaires

Nous pouvons au moins le rendre amusant et srand (heure (null)); alors si (Memchr ("AB", F (Rand ()), 2)) ); sinon met ("échec"); int f (int x) {retour x% 3 + 'a'; } ---- :)


Memchr ((Char [2]) {A, B}, F (X), 2) Pour l'amour de Dieu, pourquoi voudriez-vous suggérer quelque chose comme ça .. ...................


@Marco Bonelli pourquoi, parce que même si pas pratique, il est intéressant de voir jusqu'où on peut aller. Que diriez-vous de ABS (2 * F (x) - (A + B)) == ABS (A-B) ? Avec long long extensions pour gérer le débordement, cela pourrait fonctionner. Mais c'est tout dans amusant . Un temporaire est la voie à suivre.


@ CHUX-REINSTATEMONICA Il s'agit d'une programmation sur le site Web de questions / réponses de questions-réponses, pas un défi de code de golf ou d'obfuscation ... pendant que je trouve aussi que je pense que vous devriez préciser que ce n'est pas une réponse sérieuse.


@Marcobonelli Fair Point. Je pensais que le "laissez-nous abuser de c" suffisait de manière à ce que "n'est pas une réponse sérieuse". Peut-être trop subtile.


Cela ne change pas trop - vous devez sauvegarder A & B ou le résultat de F (x). Il n'y a aucun moyen de l'éviter. Memchr - sauve les deux


Je ne sais pas un peu que le littéral composé a ajouté une belle touche ...



0
votes

c langue n'est pas de telles constructions. Vous avez besoin de sauvegarder le résultat de la fonction ou / et les deux A & b .

Bien sûr, vous pouvez: xxx

mais bien sûr, il enregistre toutes les valeurs comme paramètres de fonctions.


0 commentaires