C/C++ Math Порядок работы

Итак, я знаю, что C++ имеет приоритет оператора и что

int x = ++i + i++;

не определено, потому что pre ++ и post ++ находятся на одном уровне, и, следовательно, нет способа определить, какой из них будет вычислен первым. Но что мне было интересно, если

int i = 1/2/3;

не определено Причина, по которой я спрашиваю, состоит в том, что есть несколько способов взглянуть на это (1/2)/3 ИЛИ 1/(2/3). Я предполагаю, что это неопределенное поведение, но я хотел бы подтвердить это.

5 ответов

Решение

В вашем примере компилятор может свободно вычислять "1", "2" и "3" в любом понравившемся порядке, а затем применять деления слева направо.

То же самое для примера i ++ + i ++. Он может оценивать i ++ в любом порядке, и в этом проблема.

Дело не в том, что приоритет функции не определен, а в том, что порядок вычисления ее аргументов таков.

Если вы посмотрите на приоритет и ассоциативность оператора C++, вы увидите, что оператор деления является ассоциативным слева направо, что означает, что он будет оцениваться как (1/2)/3, поскольку:

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

Первый фрагмент кода - неопределенное поведение, потому что переменная i изменяется несколько раз между точками последовательности.

Второй фрагмент кода является определенным поведением и эквивалентен:

int i = (1 / 2) / 3;

как оператор / имеет ассоциативность слева направо.

Это определено, это идет слева направо:

#include <iostream>

using namespace std;

int main (int argc, char *argv[]) {
    int i = 16/2/2/2;
    cout<<i<<endl;
    return 0;
}

выведите "2" вместо 1 или 16.

Можно сказать, что он не определен, потому что вы выбрали int, которое является набором целых чисел. Попробуйте удвоить или с плавающей точкой, которые включают дроби.

Другие вопросы по тегам