Информация об изменениях

Сообщение Re: семантика switch/case от 16.12.2015 14:12

Изменено 16.12.2015 14:25 xobotik

Здравствуйте, _hum_, Вы писали:

__>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/... без break-а и if/else if/else if/... c break-ом. А тут решил не ставить break "в конце ветки выбора", и опля — сюрприз. Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:

__>
__>switch(1) 
__>{
__>    case 1 : cout << '1'; // prints "1",
__>    case 2 : cout << '2'; // then prints "2"
__>}
__>

__>
__>switch(1) 
__>{
__>    case 1 : cout << '1'; break; // prints "1" and exits the switch
__>    case 2 : cout << '2'; break;        
__>}
__>


__>p.s. Вопрос к знатокам — зачем такая неочевидная и "техническая" семантика?


Пользуйся раз тебе не удобно:
#define SCASE_CONTINUE(x) case x:
#define SCASE(x, func) case x: func(); break
#define SCASEARG(x, func) cas x: func(x); break
#define SDEFAULT() default: break

// example
void printX() {
    std::cout << "in god we trust!" << std::endl; // C++
}
void printArg(int arg) {
    std::cout << std::to_string(arg) << std::endl; // C++
}
int main() {
    int x = 1;
    switch (x) {
        SCASE_CONTINUE(1);
        SCASE_CONTINUE(2);
        SCASE_CONTINUE(3);
        SCASE(4, printX);
        SCASE(5, printX);
        SCASEARG(10, printArg);
        SDEFAULT();
    }
}

Переписать, что на C++ и на C взлетит =)
P.S. Если честно, то это 3.14здец.
Re: семантика switch/case
Здравствуйте, _hum_, Вы писали:

__>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/... без break-а и if/else if/else if/... c break-ом. А тут решил не ставить break "в конце ветки выбора", и опля — сюрприз. Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:

__>
__>switch(1) 
__>{
__>    case 1 : cout << '1'; // prints "1",
__>    case 2 : cout << '2'; // then prints "2"
__>}
__>

__>
__>switch(1) 
__>{
__>    case 1 : cout << '1'; break; // prints "1" and exits the switch
__>    case 2 : cout << '2'; break;        
__>}
__>


__>p.s. Вопрос к знатокам — зачем такая неочевидная и "техническая" семантика?


Пользуйся раз тебе не удобно:
#define SCASE_CONTINUE(x) case x:
#define SCASE(x, func) case x: func(); break
#define SCASEARG(x, func) case x: func(x); break
#define SDEFAULT() default: break

// example
void printX() {
    std::cout << "in god we trust!" << std::endl; // C++
}
void printArg(int arg) {
    std::cout << std::to_string(arg) << std::endl; // C++
}
int main() {
    int x = 1;
    switch (x) {
        SCASE_CONTINUE(1);
        SCASE_CONTINUE(2);
        SCASE_CONTINUE(3);
        SCASE(4, printX);
        SCASE(5, printX);
        SCASEARG(10, printArg);
        SDEFAULT();
    }
}

Переписать, что на C++ и на C взлетит =)
P.S. Если честно, то это 3.14здец.