switch(0,1,fnk(),3,4,i)
От: Kuman  
Дата: 09.06.08 12:06
Оценка:
void fnk()
{
    cout << "!!!" << endl;
}

void f(int i)
{
     switch(0,1,fnk(),3,4,i)
     {
     case 0: cout<<0; break;
     case 1: cout<<1; f(i-1); break;
     case 2: cout<<2; f(i-1); break;
     case 3: cout<<3; f(i-1); break;
     case 4: cout<<4; f(i-1); break;
     default:
          cout<<i;
          f(i-2);
          break;
     };
}


int main( int argc, char *argv[] ) 
{
    f(11);

    return 0;
}

Кто нибудь можеть мне глупому подсказать почему такой код являеться правильным (компилируемым)?
Выполняются все аргументы выражения/условия switch и последний из них используеться для перехода по метке case.
Я считал что компилер должен грязно выругаться на такое — ан нет все ок. Ну хоть бы варнинг выкинул ...
Я понимаю что в условии может быть любое выражение а-ля "if (OK==str.length())", но каким образом обьсняеться что
только последний аргумент оператора switch() используеться для перехода по метке...

P.S. основа примера взята из тестов брейнбенч.
Добавлена разметка — Кодт
Re: switch(0,1,fnk(),3,4,i)
От: Bell Россия  
Дата: 09.06.08 12:09
Оценка:
Здравствуйте, Kuman, Вы писали:

K>Кто нибудь можеть мне глупому подсказать почему такой код являеться правильным (компилируемым)?

Читать про оператор "запятая".
Любите книгу — источник знаний (с) М.Горький
Re: switch(0,1,fnk(),3,4,i)
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 09.06.08 12:16
Оценка:
Здравствуйте, Kuman, Вы писали:

K>но каким образом обьсняеться что только последний аргумент оператора switch() используеться для перехода по метке...


Читайте внимательнее про оператор запятая. (Обычно его описываю рядом с описанием цикла for(), т.к. запятая часто там используется для инкремента сразу двух переменных.
Re[2]: switch(0,1,fnk(),3,4,i)
От: Kuman  
Дата: 09.06.08 12:41
Оценка:
Здравствуйте, Bell, Вы писали:

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


K>>Кто нибудь можеть мне глупому подсказать почему такой код являеться правильным (компилируемым)?

B>Читать про оператор "запятая".

Мдя — реально так можно ...
Re[2]: switch(0,1,fnk(),3,4,i)
От: Kuman  
Дата: 09.06.08 12:42
Оценка:
Здравствуйте, php-coder, Вы писали:

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


K>>но каким образом обьсняеться что только последний аргумент оператора switch() используеться для перехода по метке...


PC>Читайте внимательнее про оператор запятая. (Обычно его описываю рядом с описанием цикла for(), т.к. запятая часто там используется для инкремента сразу двух переменных.


Мдя, нашел — запятая рулит... спасибо...
Re[3]: switch(0,1,fnk(),3,4,i)
От: Bell Россия  
Дата: 09.06.08 12:43
Оценка:
Здравствуйте, Kuman, Вы писали:

K>>>Кто нибудь можеть мне глупому подсказать почему такой код являеться правильным (компилируемым)?

B>>Читать про оператор "запятая".

K>Мдя — реально так можно ...


В С/С++ вообще многое можно
Любите книгу — источник знаний (с) М.Горький
Re[3]: switch(0,1,fnk(),3,4,i)
От: alzt  
Дата: 11.06.08 11:56
Оценка:
Здравствуйте, Kuman, Вы писали:

K>>>но каким образом обьсняеться что только последний аргумент оператора switch() используеться для перехода по метке...


PC>>Читайте внимательнее про оператор запятая. (Обычно его описываю рядом с описанием цикла for(), т.к. запятая часто там используется для инкремента сразу двух переменных.


K>Мдя, нашел — запятая рулит... спасибо...


обычно она всё-таки не рулит, а затрудняет чтение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.