LINUX.ORG.RU

C++, switch, case ... что-то я туплю

 ,


0

3

Редко пользуюсь оператором switch, хотя думал, что знаю как он работает. Обычно я обязательно пользуюсь break, и switch тогда работает ожидаемо. Но вот я сделал примитивный пример, в котором не могу понять что происходит.

#include <iostream>

using namespace std;

int main (int argc, char *argv[]) 
{
    int i=0;

    switch (i)
    {
    	case 0  : { std::cout << "0"; }
        case 1  : { std::cout << "1"; }
      	default : { std::cout << "D"; }
    }

    return 0;
}


Что выведет этот пример?

Вначале я думал что «0».

Потом не смог найти внятного описания default - выполняется ли это условие только если не подошло ничего из остального, или просто выполняется если до него дошло дело. Я склонился к тому, что default выполняется просто если до него дошло дело (небыло никаких break). Поэтому результат должен быть «0D».

На деле на gcc результат будет таким: «01D».

Два вопроса в связи с этим:

- С какого перепугу в результате затесалось 1?
- Как же все-таки должно срабатывать default?

★★★★★

Последнее исправление: Xintrea (всего исправлений: 2)
Ответ на: комментарий от Dudraug

Могу, но это надо помнить ключи или IDA for Linux ставить... А, это ты -S поставил? Я вначале подумал что сайт по дефолту так делает.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

По дефолту сайт компилит и запускает, но я просто изменил строку командную снизу. Там обдждампа не было вообще.

Могу, но это надо помнить ключи или IDA for Linux ставить...

Какие ключи помнить надо? Еще раз, сайт не делает обдждамп, я просто поменял внизу командную строку добавив его и мне повезло, что он там есть и доступен. Это не дизасемблерный сайт, не надо его так использовать=)

Dudraug ★★★★★
()
Ответ на: комментарий от Xintrea

Касаемо свитча мне нужны еще подробности, как на низком уровне создается таблица условных переходов на нужную метку...

Есть божественный сайт: https://godbolt.org/ (вот пример кода Duradug'а https://godbolt.org/g/UXkkCS )

Он показывает, во что компилируется код (для разных компиляторов). Можно попробовать там разные варианты кода под разными компиляторами. Только не забывай еще менять уровень оптимизации в ключах компилятора.

anonymous
()
Ответ на: комментарий от anonymous

Прикольно, даже подсвечивает куски соответствующего кода.

Xintrea ★★★★★
() автор топика

тред не читал. это называется fall through, стандартная методика которая применяется в разных языках. просто погугли «fall through» с добавкой названия языка.

ещё можно погуглить duff device, это будет жестковато, но возможно полезно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.