« first day    last day (3217 days later) » 

2:27 PM
Это какие-то новинки синтаксиса? О_о
 
это старое расширение gcc которое позволяет создать массив произвольного размера в рантайме.
чит в том, что у него есть тип T[N], который известен только в рантайме
 
этим расширением gcc я как раз пользовалась (как и вложенными функциями), меня выражение после return смущает...
лямбда-функцию напоминает..
 
3:04 PM
я все равно не понимаю, где там возведение в квадрат
 
@Etki, аналогично :)
 
 
2 hours later…
5:29 PM
Забыл я С++ за год :( Но что-то мне подсказывает, что приведенный вами код работает аналогично сдвигу.
Посидел подумал. Объяснить могу пока так (с условием того, что все напрочь позабыл). Самое главное тут понять, что массив лежит на стеке, у него там НЕ косвенная адресация, то есть &a и a равны. Но при этом сам массив считается элементом. То есть (&a)[N] != a[N], то есть если мы объявили int a[X], то (&a)[N] даст нам адрес элемента памяти, который идет за N-ым повторением массива длинной X, а a[N], даст элемент в памяти по адресу a+N.
Учитывая адресную арифметику С получается, что в (&a)[X]-a мы вычитаем смещение кратное X из базового адреса а!
// сс @margosh, @Etki и всем кому могут быть интересны мои псевдотеории
@igumnov Вообще интересно бы почитать про подобную адресацию на стеке
@igumnov На самом деле еще интересно, что &a == a, но ptr = &a, &ptr != ptr.
 
5:49 PM
@NicolasChabanovsky Да там просто извращенная адресная арифметика на стэке. Мой любимый пример с SO. Вот объяснение. stackoverflow.com/questions/27828822/… и еще десяток методов возведения в квадрат без явного умножения на других языках codegolf.stackexchange.com/questions/43218/…
 
Да, там должна быть прямая, но вот с этим &a == a, но ptr = &a, &ptr != ptr вопрос остается открыт.
 
 
1 hour later…
7:18 PM
@NicolasChabanovsky нет, &a != a. у них разные типы - a это T(&)[N] или T*, а &a это T(*)[N].
а вот у (&a)[N] тип T[N], который преобразуется в T*. по этому из него можно вычесть a.
 
 
1 hour later…
8:27 PM
@Abyx Да, типы разные, но значения одинаковые.
Для компилятора они тоже равны. Это все-таки не === в javascript :)
 
да, я не так написал. значения конечно одинаковые, просто их нельзя сравнить
для &ptr != ptr значения разные т.к. это адрес переменной ptr и значение переменной.
для &a и a значения одинаковы, т.к. a преобразуется к своему адресу.
 

« first day    last day (3217 days later) »