Я искал ссылку, которую вы предоставили. После тщательного наблюдения кода я пришел к следующему выводу.
int r, countIt(int n) {.....}
эквивалентно записи в
int r;
int countIt(int n){.....}
теперь для
while (r += " 2 "[n % 10] & 3, n /= 10);
эквивалентно:
do{
r += " 2 "[n % 10] & 3;
n/=10;
}while(n);
Сейчас идет логическая часть кода
r += " 2 "[n % 10] & 3;
позвольте мне дать вам некоторые основы.
- В C++
cout<<"abcde"[2];
даст вам выход
c
Теперь, если вы посмотрите внимательно код в ссылке, которую вы предоставили его что-то вроде этого:
r += " 2 "[n % 10] & 3;
не что иное, как
r += "TAB,SPACE,SPACE,SPACE,SPACE,SPACE,TAB,SPACE,2,TAB"[n % 10] & 3;
Теперь пришло время, чтобы объяснить, как этот код вычисляет количество отверстий. Значение ASCII TAB равно 9, двоичный эквивалент которого равен 1001. Значение ASCII SPACE равно 32, бинарный эквивалент которого равен 100000.
так немного мудрая Anding TAB с 3 приведет к
1001 & 0011 = 0001 which is 1
битового мудрое Anding пространство с 3 приведет к
100000 & 000011 = 000000 which is 0
заменяющих язычков с 1 и пространством с 0, следовательно, это делает вывод, как написание
do{
r += "1000001021"[n % 10] & 3;
n/=10;
}while(n);
n% 10 - младшая десятичная цифра n. Мы используем это как индекс в строковый литерал, который содержит информацию о количестве отверстий в этой младшей десятичной цифре младшего разряда, а затем добавляем его к результату r.
Это всего лишь две декларации, объединенные вместе. Точно так же, как 'int x, y;' эквивалентно 'int x; int y; ', код, который вы показываете, эквивалентен' int r; int countIt (int n) {...} '. Определение слияния переменных и определение функции, как это, только путают; не делайте этого в своем коде, как бы круто это ни выглядело. –
Ничего себе, это довольно умно. Ужасно, но смешно. :) –
Спасибо @IgorTandetnik. И эта строка? –