Операторы

Эта глава перечисляет и описывает операторов Металлического языка штриховки. Первый раздел описывает операторов использования на скалярных или векторных операндах. Скалярный операнд является целым числом, или булевым значением с плавающей точкой, как перечислено в Скалярных Типах данных. Векторный операнд является 2-, 3-, или вектором с 4 компонентами с целым числом, или булевыми компонентами с плавающей точкой, как описано в Векторных и Матричных Типах данных.

Второй раздел описывает матричные операторы, имеющие по крайней мере один матричный операнд, как описано в Векторных и Матричных Типах данных. Эти бинарные операторы могут иметь второй скаляр, вектор или матричный операнд.

Операторы не перечислили здесь, которые поддерживаются C++ 11 — такой как sizeof(T), унарная ссылка (&), и последовательность (,) — ведут себя, как определено C++ 11 Спецификаций [PDF]. Точно так же порядок операций (т.е. приоритет и ассоциативность операторов) соответствия тот из C++ 11 языков.

Операторы на скалярах и векторах

Таблица 3-1 перечисляет операторов для скалярных и векторных значений и типов данных, которым они применяются к.

Табличные 3-1  операторы для скалярных и векторных типов данных

Операторы

Типы операнда

Тип результата

Основная арифметика:

+ (добавьте), - (вычтите), * (умножьтесь), / (разделиться)

унарный - (отрицание), + (никакое изменение знака)

Целое число или с плавающей точкой

Скаляр или вектор

То же как операнды

Арифметика модуля:

% (остаток)

Целое число только

Скаляр или вектор

То же как операнды

Префиксный или постфиксный инкремент или декремент:

++ (инкремент), -- (декремент)

Целое число только

Скаляр или вектор

То же как операнд

Реляционный:

< (меньше, чем), > (больше, чем), <= (меньше чем или равный), >= (больше, чем или равный)

Целое число или с плавающей точкой

Скаляр или вектор

Булевская переменная

Скаляр или вектор (соответствие операндов)

Равенство:

== (равный), != (не равный)

Булевская переменная, целое число или с плавающей точкой

Скаляр или вектор

Булевская переменная

Скаляр или вектор (соответствие операнда)

Поразрядно:

& (и), | (или), ^ (монопольный или)

унарный ~ (не, поразрядное дополнение до единицы)

Целое число только

Скаляр или вектор

То же как операнды

Логичный:

&& (и), || (или)

унарный ! (нет)

Булевская переменная только

Скаляр или вектор

Булевская переменная

Скаляр или вектор (соответствие операнда)

Троичный выбор:

expr1 ? expr2 : expr3

expr1: булев скаляр

expr2 и expr3: Любой тип (должен соответствовать),

Тип expr2 или expr3

Сдвиг разряда:

<< (оставленный сдвиг), >> (сместите право),

Целое число только

Скаляр или вектор

То же как операнды

Присвоение:

lvalue = выражение

Булевская переменная, целое число, или с плавающей точкой

Скаляр или вектор

Тип lvalue

Все бинарные операторы, за исключением оператора присваивания (=), может примениться к комбинациям скалярных и векторных операндов. Если типы операндов не соответствуют, и одно из преобразований, перечисленных в Неявных преобразованиях типов, применяется, операнды преобразовываются, прежде чем оператор применяется. Эти операторы могут примениться к комбинациям скалярных и векторных операндов; после преобразования следующие случаи допустимы:

Все унарные операторы (префикс +, -, и ~, и префикс или постфикс ++ или ) работайте покомпонентно над их операндами и приведите к результату того же типа.

Следующие разделы детализируют дополнительные способы поведения для определенных операторов.

Арифметические операторы

Арифметические операторы (+, -, *, /, %) возвратите результат того же типа (скаляр или вектор, целое число или с плавающей точкой) как эти два операнда. Подразделение и операции модуля могут привести к неуказанному значению:

  • Подразделение, приводящее к результату из диапазона. Для определенных целых типов подразделение приводит к значению, находящемуся вне диапазона, ограниченного его максимальными и минимальными представимыми значениями. Для типов целого числа со знаком пример TYPE_MIN / -1.

  • Деление на нуль. Деление на нуль для типов с плавающей точкой приводит к плюс или минус бесконечность или в не числе (NaN), как предписано стандартом IEEE 754. (Для получения дополнительной информации о числовой точности операций с плавающей точкой, посмотрите Числовое Соответствие.)

  • Операции модуля. Результат работы модуля, второй операнд которой является нулем, не определен. Если операнды являются векторами, работа выполняется покомпонентно: для любой пары компонентов, где значение во втором операнде является нулем, получающийся компонент не определен. (Результаты для других компонентов с ненулевыми операндами остаются определенными.), Если оба операнда являются неотрицательными, остаток является неотрицательным. Если один или оба операнда отрицательны, результаты не определены.

Целые без знака должны подчиниться законам арифметики по модулю 2n, где n является числом битов в представлении значения того определенного размера целого числа. Результат переполнения целого числа со знаком не определен.

Для целочисленных операндов, деление (/) оператор приводит к алгебраическому частному с любой отброшенной дробной частью. (Это часто вызывают усечением по направлению к нулю.), Если частное a / b является представимым в типе результата, (a / b) * b + a % b равно a.

Инкрементные и операторы понижения

Арифметика пост - и преинкрементные и операторы понижения (++ и --) добавьте или вычтите 1 к содержанию выражения, на которое они воздействуют. Значение преинкрементного или преддекрементного выражения является получающимся значением той модификации; значение постинкрементного или постдекрементного выражения совпадает со значением выражения, которым это управляет на (прежде чем, выполняя инкремент или декремент). В обоих случаях операнд инкремента или декремента должен быть lvalue выражением — т.е. выражением, которому новые значения могут быть присвоены (например, локальная переменная).

Операторы отношения и операторы равенства

Операции сравнения (<, >, <=, >=, ==, !=) результат в булевской переменной (bool введите), скаляр или вектор.

Если одним или обоими параметрами является NaN (не число), == оператор возвращается false и != оператор возвращается true. Операторы отношения всегда возвращаются false если любым параметром является NaN.

Для векторных операндов, чтобы протестировать, ли любые элементы в результате векторной тестовой истины оператора отношения, использование any или all встроенные функции, определяемые в Реляционных Функциях.

Операторы сдвига разряда

Операторы << и >> применитесь к скалярным целым числам, или покомпонентно к целочисленным векторам, путем перемещения всех битов в левый операнд числом мест в правильном операнде, как описано C++ 11 Спецификаций [PDF].

Оператор присваивания

Оператор присваивания (=) ведет себя, как описано C++ 11 Спецификаций [PDF]. В выражении lvalue = expr, если expr является скалярным типом и lvalue, является типом вектора, скаляр преобразовывается в тип элемента, используемый векторным операндом, и затем расширился к вектору, имеющему то же число компонентов как векторный операнд. Присвоение выполняется покомпонентно: Каждый компонент в lvalue присваивается значение соответствующего компонента в expr.

Значение выражения присваивания является значением, присвоенным левому операнду. Например, выражение c = b = a присваивает значение a к b, выполнение любых необходимых преобразований, затем присваивает новое значение b к c.

Операторы на матрицах

Арифметические операторы добавляют (+), вычитают (-), воздействуют на матрицы. И матрицы должны иметь те же числа строк и столбцов. Работа выполняется покомпонентно, приводя к той же матрице размера. Арифметический оператор умножается (*), воздействует на:

Если один операнд является скаляром, скалярное значение умножается к каждому компоненту матрицы, приводящей к той же матрице размера. Правильный векторный операнд обрабатывается как вектор столбца и левый векторный операнд как строковый вектор. Для вектора к матрице, матрицы к вектору и матрицы к умножению матриц, число столбцов левого операнда требуется, чтобы быть равным числу строк правильного операнда. Умножить работа выполняет линейно-алгебраическое умножение, приводя к вектору или матрице, имеющей то же число строк как левый операнд и то же число столбцов как правильный операнд.

Примеры ниже предполагают, что они векторизовали, матрицируют, и инициализируются скалярные переменные:

float3 v;
float3x3 m;
float a = 3.0f;

Следующая матрица к скалярному умножению

float3x3 m1 = m * a;

эквивалентно:

m1[0][0] = m[0][0] * a;
m1[0][1] = m[0][1] * a;
m1[0][2] = m[0][2] * a;
m1[1][0] = m[1][0] * a;
m1[1][1] = m[1][1] * a;
m1[1][2] = m[1][2] * a;
m1[2][0] = m[2][0] * a;
m1[2][1] = m[2][1] * a;
m1[2][2] = m[2][2] * a;

Следующий вектор к умножению матриц

float3 u = v * m;

эквивалентно:

u.x = dot(v, m[0]);
u.y = dot(v, m[1]);
u.z = dot(v, m[2]);

Следующая матрица к векторному умножению

float3 u = m * v;

эквивалентно:

u = v.x * m[0];
u += v.y * m[1];
u += v.z * m[2];

Следующая матрица к умножению матриц

float3x3    m, n, r;
r = m * n;

эквивалентно:

r[0] = m[0] * n[0].x;
r[0] += m[1] * n[0].y;
r[0] += m[2] * n[0].z;

r[1] = m[0] * n[1].x;
r[1] += m[1] * n[1].y;
r[1] += m[2] * n[1].z;

r[2] = m[0] * n[2].x;
r[2] += m[1] * n[2].y;
r[2] += m[2] * n[2].z;