2016-03-06 5 views
6

Это то, что у меня есть. Я не уверен, как правильно его написать. Я попробовал Googling, но безрезультатно. Пожалуйста, не съеживаться слишком много:Соответствующий формат Ternary Operator

cout << (guess > randomNumber) ? "\nWhoops! Try again!\n You guessed higher than the random number!\n\n" 
     : (guess < randomNumber) ? "\nWhoops! Try again!\n You guessed lower than the random number!\n\n" 
     : ""; 

Что я хотел это сделать, это:

// Gives hint that inputted number is higher or lower 
    // than inputted number 
    if (guess > randomNumber) 
     cout << "\nWhoops! Try again!" 
     << " You guessed higher than the random number!\n" 
     << endl; 
    else if (guess < randomNumber) 
     cout << "\nWhoops! Try again!" 
     << " You guessed lower than the random number!\n" 
     << endl; 

Любая помощь будет оценена. Я просто хочу узнать, как я могу писать свои программы, чтобы быть более эффективными и меньшими. Поблагодарили бы за отзыв.

+0

Используя один троичный оператор является эффективным ... Использование два в то же время беспорядочно, если вы спросите меня. –

+0

Код выглядит нормально для меня. Вы пытались скомпилировать его? –

+0

Есть ли причина, по которой вы хотите использовать вложенный тернарный оператор вместо этого 'if' /' else if'? Гораздо проще сказать, что делает ваша программа, глядя на нее вместо дешифрования этих вложенных троичных операторов. – ppsz

ответ

4

Помещенный некоторые скобки вокруг всего выражения, в противном случае вы будете в конечном итоге печать булевы значения:

int guess = 10; 
    int randomNumber = 9; 

    cout << (guess > randomNumber) ? "\nWhoops! Try again!\n You guessed higher than the random number!\n\n" 
      : (guess < randomNumber) ? "\nWhoops! Try again!\n You guessed lower than the random number!\n\n" 
      : "" ; 

// Output: 1 

Правильный код:

int guess = 10; 
    int randomNumber = 9; 

    cout << ((guess > randomNumber) ? "\nWhoops! Try again!\n You guessed higher than the random number!\n\n" 
      : (guess < randomNumber) ? "\nWhoops! Try again!\n You guessed lower than the random number!\n\n" 
      : ""); // Notice the brackets! 

/*Output: 
Whoops! Try again! 
You guessed higher than the random number!*/ 
+1

Большое вам спасибо! Спасибо, что заработали. :) –

+0

@ red-one Пожалуйста, отметьте его как решенную, если это так! Благодаря! –

1

более эффективным

не связаны с тем, что вы там делаете (если под «эффективным» вы имеете в виду лучшие характеристики во время выполнения).

меньше

Скромная цель, но не если читаемость дотягивает из-за этого (и даже меньше, так что, если из-за синтаксической сложности ... недостающего круглые скобки ... конечный результат неправильный).

Помните: Код написан для людей, чтобы читать.

Вы должны, вероятно, придерживаться подхода if и else, который вы также показываете в вопросе. Тем не менее, ИМХО «хороший» подход (если вам действительно нужно абстрагироваться над этим) будет упаковать его в какую-нибудь функцию:

template<class T, class X, class Y, class Z> 
void comp_if(T value, T reference, X less, Y equal, Z greater) { 
    if (value < reference) less(); 
    else if (value > reference) greater(); 
    else equal(); 
} 

Используется как

// missing real macros a lot 
comp_if(foo, bar, 
    []() {cout << "less"; }, 
    []() {cout << "equal";}, 
    []() {cout << "greater"}); 

ли это на самом деле помогает с читаемости это выбор, который я оставляю читателю.

+0

Прошу прощения, но я еще не многому научился на C++. Я все еще новичок, поэтому ... Но я понимаю вашу точку зрения на читаемость.В частности, для этого я хотел просто конденсироваться. Но я буду учитывать ваш совет в будущих программах. :) –

+0

@RedOne Нет проблем. Подход, принятый в моем ответе, действительно будет полезен, если у вас есть * много * такого кода. Всегда старайтесь добиваться как можно более читаемого кода. При этом вы будете делать гораздо меньше ошибок, потому что будет легче учесть все. (Log n умственная глубина vs n ментальная ширина) –

+0

@anonymous downvoters: пожалуйста, объясните причины вашего голосования. Мой пост ИМХО отвечает на вопрос довольно прямо. Я не думаю, что мой ответ заслуживает таких голосов только потому, что я не выделил небольшую синтаксическую ошибку (но вместо этого предоставил лучшие подходы). –

Смежные вопросы