C ++ некалькі аператараў для ўмоўнага аператара

Я спрабую выкарыстоўваць ўмоўны аператар, які робіць адну рэч у адным стане, але робіць дзве рэчы, калі ўжываецца іншае ўмова.

Разгледзім наступны прыклад:

 ( h >= 0 && h < 24 ? hour = h : hour = 0, cout << "Invalid Hour Detected\n")

Калі "ч" устаноўлены на 25, ён ўстанаўлівае «гадзіну» у 0 правільна. Калі "ч" устаноўлены на 12, ён правільна ўстанаўлівае «гадзіну» 12.

Праблема заключаецца ў тым, што ён выдае «Invalid Гадзіна Знойдзены» для абодвух сапраўдных і ілжывых умоў. Я толькі хачу яго выхадзе, калі ўмовы не будуць выкананыя.

Па сутнасці, мне цікава, калі гэта магчыма, ва ўмоўным аператары, каб зрабіць дзве рэчы для аднаго стану.

Таксама спрабаваў:

( h >= 0 && h < 24 ? hour = h : hour = 0 && cout << "Invalid Hour Detected\n")

але гэта не запускалі COUT на любым выпадку.

3
Гэта здарылася з кім-то яшчэ не так даўно. Вы павінны змяніць парадак і дадаць дужкі.
дададзена аўтар chris, крыніца
Такога роду рэчы заблытвае код. Я не рэкамендаваў бы выкарыстаць яго.
дададзена аўтар Marc Claesen, крыніца
Гэта можа дапамагчы.
дададзена аўтар juanchopanza, крыніца
Вы выкарыстоўвалі && . Калі гадзіну = 0 , выраз ілжыва і соиЬ аператар не будзе атрымаць ацэнку.
дададзена аўтар unxnut, крыніца
Сыход падрабязна спыніцца на тым, як/дзе? Я паглядзеў на гэтае пытанне і не мог знайсці нічога падобнага.
дададзена аўтар Steve Eggering, крыніца

6 адказы

Калі вы сапраўды хоча зрабіць гэта, дадайце адпаведныя дужкі і інвертаваць парадак прысваення і ўстаўку выхаду (пры выкарыстанні аператара коска, значэння элемента налева выраз адкідваюць):

( h >= 0 && h < 24 ) ? ( hour = h ) : (std::cout << "Invalid Hour Detected\n", hour = 0);

Тым не менш, мой савет <�моцны> зрабіць код для чытання і адмовіцца ад такога роду стылю кадавання .

8
дададзена
@Steve «Kepano» Eggering, Гэта тое, што я атрымліваў ст. Тыпы павінны адпавядаць па меншай меры.
дададзена аўтар chris, крыніца
@ Steve'Kepano'Eggering: Мудрае рашэнне
дададзена аўтар Andy Prowl, крыніца
Дзякуй, я іду назад да калі/іншае.
дададзена аўтар Steve Eggering, крыніца
<�Р> Я спрабую выкарыстоўваць ўмоўны аператар, які робіць адну рэч у адным стане, але робіць дзве рэчы, калі ўжываецца іншае ўмова.

Гэта не ўмоўнае заяву , гэта ўмоўная <�ет> выраз + . Ўмоўнае зацвярджэнне было б нашмат больш дарэчы з пункту гледжання чытальнасці:

if( h >= 0 && h < 24) {
    hour = h;
} else {
    hour = 0;
    cout << "Invalid Hour Detected\n";
}

+ C++ follows C in allowing use of standalone expressions as statements. That's why you can eventually "shoehorn" your solution into the right syntax by using parentheses and switching the order of operations. The readability of that solution suffers a lot compared to that of a plain, familiar if.
3
дададзена
Вось што я меў першапачаткова, проста было цікава, калі ёсць спосаб, да адной лініі яго.
дададзена аўтар Steve Eggering, крыніца
<�Р> Я спрабую выкарыстоўваць ўмоўны аператар, які робіць адну рэч у адным стане, але робіць дзве рэчы, калі ўжываецца іншае ўмова.

Гэта не ўмоўнае заяву , гэта ўмоўная <�ет> выраз + . Ўмоўнае зацвярджэнне было б нашмат больш дарэчы з пункту гледжання чытальнасці:

if( h >= 0 && h < 24) {
    hour = h;
} else {
    hour = 0;
    cout << "Invalid Hour Detected\n";
}

+ C++ follows C in allowing use of standalone expressions as statements. That's why you can eventually "shoehorn" your solution into the right syntax by using parentheses and switching the order of operations. The readability of that solution suffers a lot compared to that of a plain, familiar if.
3
дададзена
Вось што я меў першапачаткова, проста было цікава, калі ёсць спосаб, да адной лініі яго.
дададзена аўтар Steve Eggering, крыніца

Аператар коска мае самы нізкі прыярытэт ўсіх аператараў. Такім чынам, ваша выраз вылічаецца наступным чынам:

(( h >= 0 && h < 24 ? hour = h : hour = 0), cout << "Invalid Hour Detected\n") 

Вы маглі б выказаць гэта ва ўмоўным выразе, з групоўкай і правільным выкарыстаннем аператара коска. Але, калі гэта ўвогуле магчыма, было б лепш, каб выказаць гэта ў калі/іншае заяву. Калі вам трэба выкарыстоўваць яго ў выразе, разгледзець пытанне аб размяшчэнні яго ў функцыі.

0
дададзена

Ну, я ведаю, што гэта, верагодна, не адказ, які вы шукаеце, але калі вы крыху перапрацаваны гэта будзе праяснілася «натуральным».

// Handy as a utility free function (in apt namespace)
bool isValidHour(unsigned int hour) { 
    return hour >= 0 && hour < 24;
}

isValidHour(h) ? hour = h : handleInvalidHour();
//...more

// If this is not in a class then you should pass "hour" as a reference.
void MyClass::handleInvalidHour() { 
    hour = 0;
    cout << "Invalid Hour Detected\n";
}

Вядома, вы павінны выкарыстоўваць новыя станд :: хроы рэчы, калі гэта магчыма. Гэта выдатна і выразна.

0
дададзена

спрабаваць

( h >= 0 && h < 24 ? hour = h : (hour = 0 || cout << "Invalid Hour Detected\n"))

або

( h >= 0 && h < 24 ? hour = h : (hour = 0 & cout << "Invalid Hour Detected\n"))
0
дададзена