В исходном коде для nanodns нетипичное использование тернарного оператора в попытке уменьшить размер кода:
/* If the incoming packet has an AR record (such as in an EDNS request),
* mark the reply as "NOT IMPLEMENTED"; using a?b:c form to save one byte*/
q[11]?q[3]|=4:1;
Непонятно, что делает эта строка. На первый взгляд кажется, что он присваивает значение одному из двух элементов массива, но это не так. Скорее, похоже, что либо это элемент массива, либо ничего не делается (выполняется «команда» 1
).
Похоже, что это должна быть замена этой строки кода (которая действительно на один байт длиннее):
if(q[11])q[3]|=4;
Буквальный эквивалент будет таким:
if (q[11])
q[3]|=4;
else
1;
Тернарный оператор обычно используется как часть выражения, поэтому его использование в качестве отдельной команды кажется странным. В сочетании с кажущимся неуместным 1
эта строка почти квалифицируется как запутанный код.
Я провел быстрый тест и смог скомпилировать и запустить программу C(++) с константами данных в качестве «команды», такой как void main() {0; 'a'; "foobar"; false;}
. Это похоже своего рода команда nop, но я не могу найти никакой информации о таком использовании — Google не является очень удобно к этому типу поиск запрос).
Может ли кто-нибудь объяснить, что это такое и как это работает?
q[11]
, а неq[1]
. Ваш анализ правильный; без большего контекста эквивалентенif (q[11]) { q[3] |= 4; }
, только короче. - person Amadan   schedule 17.09.2015if ( q[11] ) q[3] |= 4;
- person M.M   schedule 17.09.2015