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, которое является набором целых чисел. Попробуйте удвоить или с плавающей точкой, которые включают дроби.