Не могу понять & (sizeof 2 [a]) [a] - PullRequest
0 голосов
/ 29 мая 2019

У меня есть код, который выводит bcdefg, и я не могу понять, почему.

Я искал в Google, но ничего не смог найти.

const char a[]="Abcdefg";
printf("%s",&(sizeof 2[a])[a]);

Почемуна выходе bcdefg, а не Abcdefg?

Ответы [ 3 ]

7 голосов
/ 29 мая 2019

Этот код предназначен для того, чтобы сбить вас с толку, а не делать ничего полезного.Не пишите такой код.Вот как это интерпретируется компилятором:

  • 2[a] совпадает с a[2], что является значением типа char (это значение точно не имеет значения; компилятордаже не пытается его оценить)
  • sizeof 2[a] совпадает с sizeof(char), что равно 1
  • &(sizeof 2[a])[a] - указатель на символ b встрока Abcdef - та, которая имеет индекс 1
  • printf("%s",&(sizeof 2[a])[a]), печатает строку, начиная с этого указателя
5 голосов
/ 29 мая 2019

Ссылаясь на выдержку из кода:

printf("%s",&(sizeof 2[a])[a]);

Во-первых, большинство людей не осознают этого, но оператор [] на самом деле коммутативный. a[b] эквивалентно *(a + b), что эквивалентно *(b + a), что эквивалентно b[a].

То есть 2[a] эквивалентно a[2]. Поскольку a имеет тип const char [], размер элемента такой же, как у sizeof(char), что равно 1.

Итак, теперь у нас есть:

printf("%s",&1[a]);

Ну, 1[a] эквивалентно a[1] или *(a + 1). Применение оператора address-of дает &a[1] или a + 1 (обратите внимание, что &*x это просто x).

Итак, у нас есть:

printf("%s", a + 1);

Это просто печатает строку, на которую указывает a + 1, то есть все после первого символа a.

Если вы просто переставите операторы [], ничего не делая, вы увидите, что это эквивалентно:

printf("%s", &a[sizeof a[2]]);
3 голосов
/ 29 мая 2019

Если разбить каждый сегмент:

&(sizeof 2[a])[a]

2[a] = a[2].  a[2] = a char element at position 2

sizeof(char) = 1

(1)[a] = a[1]

&(a[1]) = a reference to the 'b' in "bcdefg"

printf () затем печатает массив char, начинающийся с b и заканчивающийся нулевым терминатором

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...