Как работает группировка приоритетов операторов в C для *, / и%? - PullRequest
1 голос
/ 03 марта 2010

Ссылаясь на карманный справочник О'Рейли для 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 ]

7 голосов
/ 03 марта 2010

Это имеет смысл для меня:

int x = 4 / 3 * -3;

Группируя слева направо, получим:

int x = (4 / 3) * -3
int x = ((4 / 3) * -3);

Также см. Таблицу приоритетов . Они имеют одинаковый приоритет, поэтому они связываются слева направо.

5 голосов
/ 03 марта 2010

Вам необходимо знать как приоритет , так и ассоциативность операторов.

Умножение (*) имеет более высокий приоритет, чем сложение (+), поэтому 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 и т. Д.

Исключением является присвоение, которое является оператором в C. Назначение является ассоциативным справа, поэтому a = b = 3 следует читать как a = (b = 3).

Любая хорошая книга или учебник по Си должны иметь таблицу всех операторов (например, this ), как с приоритетом, так и с ассоциативностью.

2 голосов
/ 03 марта 2010

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

 http://www.goldfish.org/books/The%20C%20Programming%20Language%20-%20K&R/chapter2.html#s2.12
1 голос
/ 03 марта 2010

ИМХО, полезно знать об этих приоритетах операторов, но лучше использовать круглые скобки, когда есть сомнения :-). Как говорят мастера, код больше предназначен для читателей, чем для машины; если автор не уверен, и не будет читателей.

1 голос
/ 03 марта 2010

Здесь он остается ассоциативным для распознавания системы. Итак, он выполнит второй Пример только для оценки выражения.

0 голосов
/ 03 марта 2010

По математике С работает так же, как вы учились в старшей школе. Помните БОДМАС (скобки деления, умножения, сложения и вычитания). Это означает, что он ищет вычисления слева направо. В этом случае он видит 4/3 и вычисляет ответ, затем умножает ответ на -3. Вы можете использовать скобки, чтобы исправить это (4/(3*-3)). Посмотрите на на этой странице , чтобы получить сводную информацию о том, как C упорядочивает операторы и выполняет вычисления.

0 голосов
/ 03 марта 2010

Умножение и деление остаются ассоциативными слева, поэтому происходит второй порядок - операция группируется как (4/3), а затем результат умножается на -3.

0 голосов
/ 03 марта 2010

Эти ссылки должны помочь вам.

...