Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > switch ( a , b )


Автор: xperienced 13.4.2011, 16:54
Здравствуйте.
Разгребаю один сишный (не ++) код и вижу такое:

Код

switch (turns++, nal) {


Взял с полки Кернигана и Ритчи, сдул пыль, открыл на операторе switch. 
Читаю: 

Цитата

switch (выражение) {
    case констант-выраж: операторы
    case констант-выраж: операторы
    default : операторы
}


Ну, думаю, ладно. Раз написано выражение, попробую так:

Код

int tmp = turns++, nal;

switch (tmp) {


и посмотрю в дебаге значение переменной tmp.
Но, к счастью, оно не скомпилилось.

Привожу полный код:

Код


u32 H264frametype(unsigned char *p)
{
  u32 nal = p[12] & 31, turns = 0;

N: switch (turns++, nal) {
     case  1:
     case  5:
     case  6: return 6 - (nal + 12) / 3;
     case 24:
     case 28:
     case 29: nal = p[13 + (30 - nal) / 3] & 31; if (turns < 2) goto N;
     default: return 4;
   }
}


В ходе дебага эта конструкция ведёт себя так, как если бы там просто было nal.
Вопрос: как это называется и где об этом написано? И главное: зачем такое надо?



Автор: bsa 13.4.2011, 17:31
Цитата(xperienced @  13.4.2011,  16:54 Найти цитируемый пост)
как это называется и где об этом написано?

Это называется "оператор `запятая`", написано в стандарте. Результат очереди разделенной запятыми является значение полученное при самом последнем действии.

Цитата(xperienced @  13.4.2011,  16:54 Найти цитируемый пост)
зачем такое надо?

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

Автор: xperienced 14.4.2011, 08:55
спасибо

Автор: ИванМ 14.4.2011, 11:10
Руки надо оторвать этому программисту. А goto в придачу улыбает.

Автор: xperienced 14.4.2011, 13:33
Да, там код весь гоуту усыпан.
А ещё есть вот такие вещи:

Код


    unsigned int a;
    
    <занесение в а значения от 0 до 5>

    printf("%c", a["ABCXYZ"]);



Не знаю, может кому это и привычно. Я довольно долго соображал, что же это такое.

Автор: borisbn 14.4.2011, 19:55
> А ещё есть вот такие вещи
Ставлю на то, что аффтар увольнялся и решил над тобой поиздеваться

Резюме - расстреливать надо за такое 

Автор: boostcoder 14.4.2011, 20:40
http://evalsvc.googlecode.com/svn-history/r149/trunk/etmp4/mp4trace.c

Автор: xperienced 14.4.2011, 21:26
Цитата(borisbn @  14.4.2011,  19:55 Найти цитируемый пост)
Ставлю на то, что аффтар увольнялся и решил над тобой поиздеваться


Совсем нет. Это из open source проекта http://www.tkn.tu-berlin.de/research/evalvid/.

Автор, скорее всего, старой закалки. Из тех времён когда памяти было меньше, процессоры медленнее, трава зеленее ...
Тогда гоуту и прочие прелести были в порядке вещей. 


Цитата(boostcoder @  14.4.2011,  20:40 Найти цитируемый пост)
http://evalsvc.googlecode.com/svn-history/...tmp4/mp4trace.c 


Это проект EvalSvc, автор которого беспардоннейшим образом взял исходники EvalVid, внёс незначительные изменения (в один! файл), переименовал проект и написал http://ieeexplore.ieee.org/Xplore/login.jsp?url=http%3A%2F%2Fieeexplore.ieee.org%2Fiel5%2F5510864%2F5522687%2F05523712.pdf%3Farnumber%3D5523712&authDecision=-203 о том какой крутой программный комплекс он реализовал. Но не будем об этом.

Автор: borisbn 14.4.2011, 21:30
boostcoder, убил. наповал. срочно принять закон РФ, чтобы за такое расстреливать. 3 раза.

Автор: bsa 15.4.2011, 15:54
Цитата(xperienced @  14.4.2011,  21:26 Найти цитируемый пост)
Автор, скорее всего, старой закалки. Из тех времён когда памяти было меньше, процессоры медленнее, трава зеленее ...
Тогда гоуту и прочие прелести были в порядке вещей. 

Я пишу под 8-ми битный микроконтроллер. Там тоже памяти мало, нет операций умножения и деления... И ничего. Почему-то goto мне использовать не пришлось... Да и таких заумных конструкций тоже.
Компилятору сугубо фиолетово, сколько операций напихано в строчку. Все равно он их разобьет на элементарные.
Поэтому, нечего пинять на медленные процессоры и маленькую память. Если программист дурак, то от глупостей его уже ничего не спасет.

Автор: Earnest 15.4.2011, 20:25
bsa, это не глупость, а просто другие времена. 20 лет назад код писали не так как сейчас. Наверное, это что-то вроде останков "ассемблерного" мышления в терминах регистров и отдельных переменных... Иногда мне приходится ковыряться в своем же коде ~10-летней давности (кое-что до сих пор работает и в переписывании особо не нуждается), я его просто с трудом понимаю - настолько стиль мышления изменился. А что еще раньше было, вообще с трудом уже представляю. На моей памяти концепции несколько раз менялись... И нельзя сказать, что в этом деле наблюдаются сплошные плюсы... но это уже совсем другая тема.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)