Никогда не пишите такой код.
For j<1000
, j/1000
это ноль (целочисленное деление). Так:
(&main + (&exit - &main)*(j/1000))(j+1);
эквивалентно:
(&main + (&exit - &main)*0)(j+1);
Который:
(&main)(j+1);
Какие звонки main
сj+1
.
Если j == 1000
, то получаются те же строки, что и:
(&main + (&exit - &main)*1)(j+1);
Который сводится к
(&exit)(j+1);
Который есть exit(j+1)
и выходит из программы.
(&exit)(j+1)
и exit(j+1)
по сути одно и то же - цитируя C99 §6.3.2.1 / 4:
Обозначение функции - это выражение с типом функции. За исключением случаев, когда это операнд оператора sizeof или унарный оператор & , указатель функции с типом « тип, возвращающий функцию » преобразуется в выражение, имеющее тип « указатель на тип, возвращающий функцию ».
exit
обозначение функции Даже без унарного &
оператора адресации он рассматривается как указатель на функцию. ( &
Просто делает это явным.)
А вызовы функций описаны в §6.5.2.2 / 1 и следующие:
Выражение, которое обозначает вызываемую функцию, должно иметь указатель типа на функцию, возвращающую void или возвращающую тип объекта, отличный от типа массива.
Так exit(j+1)
работает из-за автоматического преобразования типа функции в тип указателя на функцию, а также (&exit)(j+1)
работает с явным преобразованием в тип указателя на функцию.
Тем не менее, приведенный выше код не соответствует ( main
принимает либо два аргумента, либо ни одного вообще) и &exit - &main
, я полагаю, не определен в соответствии с §6.5.6 / 9:
Когда вычтены два указателя, оба должны указывать на элементы одного и того же объекта массива или один после последнего элемента объекта массива; ...
Добавление (&main + ...)
будет действительным само по себе и может быть использовано, если добавленное количество будет равно нулю, поскольку в п. 6.5.6 / 7 говорится:
Для целей этих операторов указатель на объект, который не является элементом массива, ведет себя так же, как указатель на первый элемент массива длиной один с типом объекта в качестве его типа элемента.
Таким образом, добавление нуля к &main
будет в порядке (но не очень полезно).
main
в C ++.