Facebook основной сайт, мобильное сафари, ярлыки на домашнем экране и локальное хранилище

С C ++ существует только несколько операторов, которые гарантируют порядок оценки

  • operator && сначала оценивает левый операнд, и если значение логически false, то оно позволяет избежать оценки правильного операнда. Типичным использованием является, например, if (x > 0 && k/x < limit) ..., который позволяет избежать деления на нулевые проблемы.
  • operator || сначала оценивает левый операнд, и если значение логически true, то оно позволяет избежать оценки правильного операнда. Например, if (overwrite_files || confirm("File existing, overwrite?")) ... не будет запрашивать подтверждение, когда установлен флаг overwrite_files.
  • operator , оценивает сначала левый операнд, а затем правый операнд, возвращая значение правого операнда. Этот оператор не используется очень часто. Обратите внимание, что запятые между параметрами в вызове функции не являются операторами запятой, и порядок оценки не гарантируется.
  • Тройной оператор x?y:z сначала оценивает x, а затем в зависимости от логического значения результат оценивает либо только y, либо только z.

Для всех других операторов порядок оценки не указан.

Ситуация на самом деле хуже, потому что это не то, что порядок не указан, но что для выражения вообще нет даже «порядка», и, например, в

std::cout << f() << g() << x(k(), h());

возможно, что функции будут вызываться в порядке h-g-k-x-f (это немного тревожно, потому что ментальная модель оператора << каким-то образом передает идею последовательности, но на самом деле уважает последовательность только в результатах порядка, которые помещаются в поток, а не в том порядке, в котором результаты вычисляются).

Очевидно, что зависимостей значений в выражении могут вводить некоторую гарантию порядка; например, в приведенном выше выражении гарантировано, что оба k() и h() будут вызываться до x(...), потому что для вызова x необходимы обратные значения из обоих.

Обратите также внимание на то, что гарантии для &&, || и , действительны только для предопределенных операторов. Если вы перегружаете эти операторы для своих типов, они будут в этом случае, как обычные вызовы функций, и порядок оценки операндов будет неуказан.

0
задан neuhaus 18 March 2019 в 12:15
поделиться