Как работает группировка приоритетов операторов в C для *, / и%?
Ссылаясь на карманный справочник О'Рейли для C, я немного смущен описанием для группировки *
, /
, а также %
операторы. В книге говорится, что группировка происходит слева направо - теперь я думаю, что меня путают с порядком оценки. Учитывая следующее уравнение и правила, установленные из книги, я бы подумал, что...
int x = 4 / 3 * -3
... оценивает 0
, так как...
1: 4 / 3 * -3
2: 4 / -9
3: 0
... однако, на самом деле это оценивает -3
и, кажется, использовать этот метод...
1: 4 / 3 * -3
2: 1 * -3
3: -3
Это почему?
8 ответов
Это имеет смысл для меня:
int x = 4 / 3 * -3;
Группируя слева направо, получим:
int x = (4 / 3) * -3
int x = ((4 / 3) * -3);
Также см. Таблицу приоритетов. Они имеют одинаковый приоритет, поэтому они связываются слева направо.
Вам нужно знать как приоритет, так и ассоциативность операторов.
Умножение (*) имеет более высокий приоритет, чем сложение (+), поэтому 2+3*4 интерпретируется как 2+(3*4), как в C, так и в обычной математике. Но в выражении типа 2*3/4 или 2 * 3 * 4 все операторы имеют одинаковый приоритет, и вам нужно взглянуть на ассоциативность. Для большинства операторов это слева направо, что означает, что вы начинаете группировку слева: 2*3/4 становится (2*3)/4, 2*3*4*5 становится ((2*3)*4)*5 и т. Д.
Исключением является присваивание, которое является оператором в Си. Присвоение ассоциативно справа, поэтому a = b = 3 следует читать как a = (b = 3).
Любая хорошая книга или учебник по Си должны иметь таблицу всех операторов (таких как этот), как с приоритетом, так и с ассоциативностью.
Посетите следующий URL. Это очень полезно для всех тем в C. Таким образом, вы также можете использовать приоритет оператора.
http://www.goldfish.org/books/The%20C%20Programming%20Language%20-%20K&R/chapter2.html#s2.12
Здесь он остается ассоциативным для распознавания системы. Таким образом, он выполнит второй пример только для оценки выражения.
ИМХО, полезно знать об этих приоритетах операторов, но лучше использовать круглые скобки, когда есть сомнения:-). Как говорят мастера, код больше предназначен для читателей, чем для машины; если автор не уверен, и не будет читателей.
Умножение и деление остаются ассоциативными слева, поэтому происходит второй порядок - операция группируется как (4/3), а затем результат умножается на -3.
По математике С работает так же, как вы учились в старшей школе. Помните БОДМАС (скобки деления, умножения, сложения и вычитания). Это означает, что он ищет расчет слева направо. В этом случае он видит 4/3
и вычисляет ответ, затем умножает ответ на -3. Вы можете использовать скобки, чтобы исправить это (4/(3*-3)
). Посмотрите на эту страницу, чтобы получить сводную информацию о том, как C упорядочивает операторы и выполняет вычисления