Я читал Новости Хакера и Эта статья подошел. Он содержит raytracer, код которого написан на обратной стороне визитной карточки. Я решил, что было бы неплохо с академической точки зрения перевести c ++ на python, но есть несколько концепций, на которых я застрял.
Сначала появляется эта функция: i T(v o,v d,f& t,v& n){...}
Который переводится на int Tracer(vector o, vector d, float& t, vector& n){...}
Что это float&
имею в виду? Я знаю что в других местах &
используется как ==
это тот случай здесь? Вы можете сделать это в C ++?
Во-вторых, я заметил эти три строки:
for(i k=19;k--;) //For each columns of objects
for(i j=9;j--;) //For each line on that columns
if(G[j]&1<<k){
Я знаю <<
немного сдвиг, и я предполагаю, &
является ==
, Являются ли циклы for такими же, как цикл for в другом?
Наконец, эта строка: v p(13,13,13);
Я не совсем уверен, что он делает. Создает ли он класс, помеченный p, который расширяет v (вектор) со значениями по умолчанию 13,13,13?
Это, наверное, глупые вопросы, но я хочу посмотреть, смогу ли я это понять, и мои поиски ничего не дали. Заранее спасибо!
Что это
float&
имею в виду?
Вот, &
означает «ссылка», поэтому аргумент передается по ссылке.
Я знаю что в других местах
&
используется как==
это тот случай здесь?
&
означает разные вещи в разных контекстах, но это никогда не значит ==
, В этом случае это также не оператор; это часть спецификации типа, что означает, что это ссылочный тип.
Я знаю << немного сдвиг, и я предполагаю,
&
является==
Нет, это поразрядно и оператор. В результате биты устанавливаются там, где бит установлен в обоих операндах. Здесь, с 1<<k
как один операнд, результатом является кго немного G[j]
; так что это проверяет, установлен ли этот бит.
Являются ли циклы for такими же, как цикл for в другом?
Да. Если вы не используете фигурные скобки вокруг тела цикла for, тогда тело — это одно утверждение. Таким образом, в этом случае тело первого цикла является вторым циклом. Чтобы прояснить это, я бы порекомендовал сделать отступ в теле цикла и использовать фигурные скобки независимо от того, являются ли они строго необходимыми. Но, конечно, я не пишу (намеренно) запутанный код.
Наконец, эта строка:
v p(13,13,13);
v
класс с конструктором, принимающим три аргумента Это объявляет переменную с именем p
типа v
инициализирован с использованием этого конструктора; т.е. три координаты инициализируются в 13
,
Когда ты видишьVector& n
это ссылка на вектор, переданный в функцию. Это означает, что вы можете изменить n
внутри этой функции без необходимости копировать ее в другой вектор или без возврата вектора. Этот предыдущий ответ должен быть полезным для вас.