Преобразование следующего кода C++ в Nim

Я пытаюсь изучить Nim, конвертируя различные фрагменты кода, и я наткнулся на то, чего никогда раньше не видел.

#include<bits/stdc++.h>
...
for(int t=q&1?u+x:u+x>>1;t>1;)t/=p[++cnt]=sieve[t];
...
sort(p+1,p+cnt+1);

Я понимаю, что такое тернарный оператор и как он работает, чего я не совсем понимаю, так это того, что происходит с переменными «t» и «cnt» (обе целые числа) и массивом «p» (массив целых чисел). Как работает использование приращения в качестве индекса «p»?

Затем есть функция сортировки, от которой я полностью отказался, потому что не смог найти никакой документации о том, что она делает (тот факт, что она принимает целое число, добавленное к массиву, очевидно, не помогает).


person Nicolás Siplis    schedule 14.07.2015    source источник


Ответы (2)


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

for(int t = (q & 1? u + x: u + x >> 1); t > 1;)
{
    t /= p[++cnt] = sieve[t];
}

что происходит с переменными "t" и "cnt" (целые числа) и массивом "p" (массивом целых чисел)

Таким образом, t устанавливается либо на u + x, либо на u + x >> 1 в зависимости от того, что такое q & 1. Затем внутри цикла мы делим t на любое значение sieve по индексу t. Мы также присваиваем это значение массиву p в позиции ++cnt. ++cnt использует оператор предварительного увеличения, чтобы увеличить значение cnt на 1, а затем используя это значение для индекса p.

Затем есть функция сортировки, от которой я полностью отказался, потому что не смог найти никакой документации о том, что она делает.

Для этого я предполагаю, что они используют функцию std::sort(). При работе с массивами имя массива рассматривается как указатель на первый элемент массива. Поэтому, когда мы видим sort(p+1,p+cnt+1);, вы можете перевести его на sort(one from the begining of the array, cnt + 1 elements from the begining of the array);. Так что это будет сортировать все элементы в массиве от одного с начала массива до одного элемента меньше, чем cnt + 1 от начала массива.

person NathanOliver    schedule 14.07.2015

Вы пытаетесь выучить Nim, как вы сказали, или пытаетесь выучить C? Обе вещи, о которых вы спрашивали, довольно просты c:

++cnt имеет побочный эффект (cnt=cnt+1) в сочетании со значением, которым заканчивается cnt. Это значение используется в качестве индекса. Побочный эффект есть побочный эффект.

p+1 и p+cnt являются указателями. Имя массива рассматривается как постоянный указатель на первый элемент этого массива в большинстве случаев использования в C. Указатель плюс целое число — это еще один указатель, указывающий на это количество элементов после оригинала.

person JSF    schedule 14.07.2015