Выкарыстанне набораў ў справаздачы «перамыкач»

Ці магу я дадаць наборы замест лікаў у «перамыкач» заяву? як:

switch(number)
{
 case 1<50: //if number is between 1 and 50
 {
 blah;
 break;
 }
 case 50<100: //if number is between 50 and 100
 {
 blah;
 break;
 }

і гэтак далей.

1

7 адказы

(Edit наступныя каментары ніжэй, пацверджанне даецца карыстальнікам Syam)

No. In C++ you can only switch on things that reduce to an integer. You'll need to build a function that computes integral results for 1 < 50 and 50 < 100 etc. and use switch(thatFunction(...)).

Ці, калі вам не трэба ідыёмы наступныя, хоць тое, што перамыкач дае вам (мяркуючы па вашаму прыкладу, вы не), проста выкарыстоўвайце , калі , інакш, калі , яшчэ .

Extract from below comments: 6.4.2-2 [stmt.switch] The condition shall be of integral type, enumeration type, or of a class type for which a single non-explicit conversion function to integral or enumeration type exists [...] the constant-expression shall be a converted constant expression (5.19) of the promoted type of the switch condition

6
дададзена
<�Я> Вам трэба стварыць функцыю, якая вылічае Int вынікі за 1 <50 і 50 <100 і г.д., і выкарыстанне пераключальніка (thatFunction (...)). Вы можаце растлумачыць гэта? Гэта здаецца карысным. Акрамя таго, я не хачу выкарыстоўваць , калі і яшчэ , таму што я хацеў бы выкарыстаць яго для прагляду некаторых абласцей на экране, і гэта азначае, што выкарыстанне вялікай колькасці каардынаты.
дададзена аўтар Zoltán Schmidt, крыніца
Які поўны пералік рэчаў, якія вы хочаце ўключыць? У вас ёсць 1 <50 і 50 <100, але яны даволі бессэнсоўна, паколькі яны з'яўляюцца толькі цэлыя литералы.
дададзена аўтар Bathsheba, крыніца
Эй сям: Вы ўпэўненыя ў гэтым? Я перакананы (паколькі я вырас думаць), што ў C любы лік, большае, чым міжнар будзе ўвесці перыядычнасць ў камутатары. Гэта не дакладна ў C ++ таксама?
дададзена аўтар Bathsheba, крыніца
Syam: Калі вы змесціце гэта ў якасці адказу я даць вам +10.
дададзена аўтар Bathsheba, крыніца
@Bathsheba Вы можаце толькі пераключыцца на <�я> цэлыя лікі </я> не толькі на Int . <�Код> int64_t і сімвал цалкам прымальныя тыпы.
дададзена аўтар syam, крыніца
@Bathsheba: <�я> 6.4.2-2 [stmt.switch] Умова павінна быць цэлалікавага тыпу, пералічэння тыпу, або тыпу класа, для якіх адзін без відавочнай функцыі пераўтварэння да інтэгральнай або пералічэння тыпу існуе [.. .] канстанта-выраз павінна быць канвертаваны пастаяннае выраз (5.19) прасоўваецца тыпу стану выключальніка. Ці проста паспрабуйце ўключыць 4294967299LL (2 ^ 32 + 3) і мець справу з 3 - калі, вядома, ваш Int 32 біта, а доўгі доўгі 64 біта. ;)
дададзена аўтар syam, крыніца
@Bathsheba: Нах, проста змяніць свой адказ, каб чытаць <�я> лік замест Int і я буду задаволены. ;)
дададзена аўтар syam, крыніца

1 < 50 is a boolean expression that gets a compile-time value of true, and thus becomes 1 in an integer context. So you end up with two identical cases in your switch. Compile with high warning level - your compiler will surely complain.

2
дададзена
Я ведаю, што 1 <50 не правільны шлях для гэтага, я проста праілюстраваў код.
дададзена аўтар Zoltán Schmidt, крыніца

Для мяне, гэта працуе на маім г ++ (GCC) 4.7.2 20.121.109

#include 

using namespace std;

int main() {

    switch(6) {
        case 1 ... 5:
            cout << "Between 1 and 5" << endl;
            break;
        case 6 ... 10:
            cout << "Between 6 and 10" << endl;
            break;
    }
}

Thanks for stating in the comments that it's GCC's extenstion

1
дададзена
вы маеце рацыю, гэта важна адзначыць, я проста падумаў, што было б нядрэнна мець яго тут
дададзена аўтар Jan Vorcak, крыніца
@syam - так, гэта папярэджанне (-pedantic) апавяшчэнне пра тое, што ён не павінен працаваць, акрамя НКУ, таму я ўказаў версію свайго кампілятара ў пост
дададзена аўтар Jan Vorcak, крыніца
GCC 4.7.2 дае мне папярэджанне: дыяпазон выразаў у аператарах камутатара з'яўляюцца нестандартнымі ( -std = C ++ 11 -Wall -Wextra -pedantic ).
дададзена аўтар syam, крыніца
Гэта пашырэнне, аднак.
дададзена аўтар StoryTeller, крыніца

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

case 1:
case 2:
    blah;
    break;

але для вялікіх дыяпазонаў адзіны разумны варыянт , калі ... астатняе .

1
дададзена

Гэта добра абмяркоўваецца тут </а >.

Заява перамыкач карысна, калі вы павінны выкарыстоўваць адну зменную ў многіх магчымых умовах. Аператар перамыкач працуе хутчэй, чым , калі-інакш блок з дапамогай

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

case 1+a;

break;

case 5;

break;

А што, калі а гэта 4 . Гэта выкліча праблемы. Калі яно не выкарыстоўваць табліцу пераходаў ён не будзе вельмі карысным, чым , калі-інакш блок

0
дададзена

Вы не можаце зрабіць гэта ў C ++. <�Код> выпадак перамыкачы павінны быць канстантай, якая можа быць ператворана ў Int .

0
дададзена

Conditionals не дапускаецца ў выпадку заявы, так што ваш варыянт заключаецца ў выкарыстанні калі/іншае заявы.

0
дададзена