?

Log in

No account? Create an account

Previous Entry | Next Entry

Я давно знаю об этом забавном факте. Однако многим это вышибает крышку.
Смотрите:
Открываем vi, набиваем вот такой простенький код:

#include
[Error: Irreparable invalid markup ('<stdio.h>') in entry. Owner must fix manually. Raw contents below.]

Я давно знаю об этом забавном факте. Однако многим это вышибает крышку.
Смотрите:
Открываем vi, набиваем вот такой простенький код:

#include <stdio.h>
main()
{
char a[3];

2[a] = 12;
printf("%d\n", a[2]);
return(0);
}


Закрывем vi, комплилируем - компилируется, и запускаем. На выходе получаем 12.


Таким образом, относительно массива в C справедливо следующее:

ARRAY[X] <=> X[ARRAY]

А знаете почему?... Кстати, хороший вопрос для поступающего на работу. Без реального понимания того, как компилятор C компилирует массивы, не ответишь.

Comments

( 10 комментариев — Оставить комментарий )
ak_47
13 авг, 2010 14:44 (UTC)
Я не думаю что это хороший вопрос для поступающего наработу. Этот трик знают немногие, а в реальной практике вообще никому не нужен. Про оператор [] достаточно знать что
x[y] <=> *(x + y)
для любых x и y.
peresmeshnik
13 авг, 2010 17:06 (UTC)
Этот трик действительно знают немногие. Но как раз совершенно неинтересно, знает кандидат трик, или нет. Интересно, сможет ли он его объяснить, как ты объяснил. Принят.
ak_47
13 авг, 2010 23:06 (UTC)
Ну раз принят, то можно теперь расслабиться и пошутить с интервьюирующим дальше на эту тему. :) Например, вот такой вариант многих удивляет ещё больше:
char ch = 2["hello"];
assert(ch == 'l');
В оператор [] вообще можно всё что угодно пихать, лишь бы один из операндов был поинтером, а второй целочисленным.
:)
vyhuhol
13 авг, 2010 15:17 (UTC)
Мне в своё время, как ты говоришь, «крышку вышибло» Duff's device-ом.
peresmeshnik
13 авг, 2010 17:08 (UTC)
Я не очень впечатлился, честно говоря. Чтобы понять Даф-девайс, не нужно глубокое понимание С. Базовые вещи - как работает оператор switch.
vyhuhol
14 авг, 2010 08:49 (UTC)
Можно подумать, что [] -- это не оператор.
adso_da_melk
13 авг, 2010 16:02 (UTC)
Язык С - такая прелесть...
peresmeshnik
13 авг, 2010 17:05 (UTC)
Ага. Офигенный. Очень его люблю.
adso_da_melk
14 авг, 2010 10:54 (UTC)
Я предпочитаю пиво ;)
remkofv
6 дек, 2010 21:29 (UTC)
Ответ на вашу запись...
Чтож вы так долго про это не писали?
( 10 комментариев — Оставить комментарий )