Comment pourrais-je réaliser quelque chose comme ça ... 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) EDIT 1: Je n'ai pas autorisé à utiliser la déclaration de commutation Pour cette affectation p> EDIT 2: Puis-je définir une plage avec une seule expression comme celle-ci? p> serait valide (type de retour est int) ? p> p>
3 Réponses :
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 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> > 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).
if (f(x) & (1+2+4)) {...}
Comment tester pour plusieurs valeurs de retour d'une fonction appelée une seule fois sans stocker dans une variable (?) p>
Pas vraiment, mais avec certaines restrictions, laissez-nous abuser c et supposons
a, b code> et
f () code> renvoie un caractère. P>
1 sup> former un tableau de caractères composé de
A code> et
B code> et recherchez-le à l'aide de
MEMCHR () code>. Inspiré par @ David C. Rankin (il ne stocke pas le résultat de
f () code> dans une variable, mais appelle une fonction) p>
xxx < / PRE>
Je vois SOP ajouté "Type de retour est INT" - OH bien. P> <<
Si (2
est un code valide, mais ne fait pas ce qui veut. p> c'est comme
si (((2
qui compare f (x) code> avec 2 et résulte 0 ou 1, qui est toujours inférieur à 5. P>
La foule difficile ce soir, alors que diriez-vous de ce qui suit. A besoin d'un peu de mathématique pour
int code> overflow`, mais est proche. P>
xxx pré>
1 sup> pas sérieux Suggestions de code pour le code de production - Utilisez un temporaire. P> BlockQuote>
Nous pouvons au moins le rendre amusant et srand (heure (null)); code> alors
si (Memchr ("AB", F (Rand ()), 2)) ); sinon met ("échec"); code> où
int f (int x) {retour x% 3 + 'a'; } code> ----
:) code>
Memchr ((Char [2]) {A, B}, F (X), 2) Code> Pour l'amour de Dieu, pourquoi voudriez-vous i> 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) CODE>? Avec
long long code> 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 ...
c langue n'est pas de telles constructions. Vous avez besoin de sauvegarder le résultat de la fonction ou / et les deux Bien sûr, vous pouvez: p> mais bien sûr, il enregistre toutes les valeurs comme paramètres de fonctions. P> P> A code> &
b code>.
commutateur (f (x)) {case 'a': ... cas 'b': ...} code> Voir exemple d'utilisation avec
sscanf code> 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 b>)
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))) {...} code>
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 code> (ou
int code>) puis utilisez
si (Strchr ("AB", F (x)). ) code>
@ DAVIDC.RANKIN
Strchr ("AB", F (X)) Code> correspond sur 3 valeurs. Peut-être que
memchr () code>?
Quel type est
a, b code> et de retour de
f () code>?
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 code> 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 code> mais le point est que même si c'est possible i>, je ne vois pas de manière propre pour le faire sans une variable simplement temporaire.