2010-03-17 2 views
2

J'ai récemment rencontré cette question: Comment réduire cette expression: s> 73? 61: 60;.Une question d'interview sur l'opérateur conditionnel

L'indice donné était que Au lieu d'utiliser l'opérateur conditionnel, nous pourrions utiliser une comparaison simple qui fonctionnera bien.

Je ne suis pas sûr mais je pense que c'est possible avec une extension de GCC, bien que je ne sois pas capable de le comprendre moi-même.

EDIT: L'expression entière est la suivante: s-=s>73?61:60

+27

Vous ne voulez pas travailler pour des personnes qui posent ce genre de questions lors d'entretiens. –

+8

La réponse correcte est "allez interviewer ailleurs, qui pose des questions valables" –

+1

Est-ce que les gens demandent des choses comme ça pour les interviews "job"? Désolé, je suis encore étudiant: D – AraK

Répondre

15

Tout comme les autres réponses:

s -= (s > 73) + 60; 

Cette expression fonctionne parce que la spécification définit les résultats des opérateurs relationnels. Section 6.5.8 paragraphe 6:

Chacun des opérateurs < (moins), > (supérieur), <= (inférieur ou égal à), et >= (plus supérieur ou égal à) doit donner 1 si la relation spécifiée est vraie et 0 si elle est fausse. Le résultat a le type int.

+10

C'est une solution élégante pour une mauvaise question;) – AraK

+6

Cela fonctionne aussi en C++, où le résultat de la comparaison est 'bool', et où' + 'promeut des opérandes entiers, et où' bool' promeut '0' et' 1' pour 'false' et' true' respectivement. (en supposant que 's' est un simple' int' et non une classe). –

+0

+1 @Johannes pour la perspective C++. –

4

Ceci est un genre de code laid que je ne peux pas beleive je l'ai écrit, mais je pense qu'il répond aux exigences:

Ma réponse à la question initiale qui était s>5?6:9:

9 - (((int)(s > 5)) * 3)

Réécriture pour la question mise à jour:

61 - (int)(s > 73)

+1

Lol, très impressionnant. – Daniel

+0

Désolé, j'étais en train de retoucher quand vous avez posté. –

0

Quelle est la valeur de (s>5)? Pourriez-vous faire un peu d'arithmétique avec ça? Sans l'allusion, je dirais que c'était une mauvaise question d'entrevue "gotcha" qui nécessite un aperçu a-ha particulier qui n'est pas corrélé avec la capacité. Avec l'indice, c'est ... bien, mais dim.

2

Peut-être que cela?

60 + !!(s > 73) 

Le double-bang mappe les valeurs non nulles à 1 et zéro à zéro.

+6

Vous n'avez pas besoin de faire cela, la spécification garantit que les opérateurs relationnels renvoient 1 ou 0. Section 6.5.8 paragraphe 6. –

+0

@Carl, merci, je ne le savais pas. –

0

Si nous partons du principe que True = 1 et False = 0, alors ça ne marche pas:

s-= (60 + (s > 73)) 
8

Comment réduire cette expression: s-=s>73?61:60;

Que diriez-vous:

typedef int Price; 
Price getPriceAfterRebate(const Price priceBeforeRebate) 
{ 
    const Price normalRebate = 60; 
    const Price superRebate = 61; 

    const Price superRebateThreshold = 73; 

    Price returnValue = priceBeforeRebate; 
    if (priceBeforeRebate > superRebateThreshold) 
    { 
    returnValue -= superRebate; 
    } 
    else 
    { 
    returnValue -= normalRebate; 
    } 
    return returnValue; 
} 

Tada! Un morceau de code non maintenu laid est réduit à un bloc de code lisible et maintenable.

+2

trible rofl'ed lol –

+0

+1 pour valeur de divertissement. – Ari

+0

@Ari, litb: Je suis content que vous l'ayez apprécié. – Bill

0

On peut considérer que s - = (s> 73) + 60 car> est un opérateur relationnel et il retournera 1 ou 0 en fonction du résultat de l'expression s> 73, Comme la valeur de retour est int il fonctionnera bien