2016-12-17 8 views
0

Я написал парсер выражений, который выплевывает кучу инструкций ассемблера для x86, x64 и ARM.Предупреждение GCC C++: предложите круглые скобки

Чтобы проверить это, я написал небольшое приложение, которое генерирует случайные выражения, компилирует их с помощью GCC и сравнивает результат с моим кодом, насколько это хорошо.

Теперь я хочу, чтобы мой парсер выдавал предупреждения, похожие на GCC.

Я заметил, что с GCC 5.1.0

int a = 100 + 100 | 10; 

GCC дают Формулирование скобки предупреждение вокруг |

но

int b = 100 * 100 | 10; 

НКУ не дает никаких предупреждений.

но и добавление, и умножение имеют более высокий приоритет, чем побитовое ИЛИ, поэтому почему предупреждение на int b = выражение?

Я очень устал, так что, возможно, что-то упустил.

+4

Лично я хотел бы использовать круглые скобки для того, чтобы просто понять, что происходит –

+0

См. Https://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Warning-Options.html#index-Wparentheses- 201 –

+0

Лично я бы не использовал круглые скобки для них, и я бы, конечно, расценил это как полную наглость, чтобы компилятор предлагал добавить избыточный синтаксис. – EJP

ответ

1

Окончательный ответ может прийти только из разработчики, но я думаю, причина в том, что существуют другие языки, которые имеют разные предпочтения этих операторов, и поэтому пользователи этих других языков могут неверно интерпретировать это выражение. Например, в some Pascal dialects,& имеет тот же приоритет, что и *, и | имеет тот же приоритет +, поэтому выражение, включающее как +, так и | withou t между разными вариантами может иметь различную интерпретацию (стандартный Pascal не имеет & или |, но приоритет и or в стандартном Pascal соответствует тем же правилам). Я предполагаю, что так же, как многие языки копируют приоритет оператора C, другие копируют Pascal.

2

Это вопрос Precedence, * является приоритетом 5, + 6 и | равно 12.

Итак, когда вы получите предупреждение от одного, а не из других вы нашли компилятор несогласованность. Или компилятор есть правило, которое говорит, если (priorityDifference (X, Y) < 7 дисплей предупреждение parentesis, который не имеет никакого смысла.

Опубликовать сообщение об ошибке против вашей версии.

+1

Я не думаю, что это ошибка. Это распространяется на https://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Warning-Options.html#index-Wparentheses-201 -Wparentheses (входит в состав -Wall) –

+0

@CaptainGiraffe, да, что охватывает это, но в конкретной разнице здесь, почему люди должны получать больше (или меньше) путаться с помощью '*' в отличие от '+'? – Surt

+1

Нет, это НЕ ошибка! Потому что приоритет имеет значение. Это смешивает арифметические и побитовые операторы! Применение побитового ИЛИ в результате двух выражений int или int не является чем-то необычным. Выполнение математики с результатом побитового ИЛИ действительно странно. – geipel

0

После прочтения комментария по celtschk, я попробовал несколько выражений в C++ и бесплатный паскаль

C++

a = 100 + 100 & 100; // = 64 
    a = (100 + 100) & 100; // = 64 

Free Pascal

a := 100 + 100 and 100; // = 200 
    a := (100 + 100) and 100; // = 64 

Free Pascal

a := (100 + 100) and 222; // = 200 
    a := 100 + 100 and 222; // = 168 

// C++

a = 100 * 100 & 222; // = 16 

// Free Pascal

a := 100 * 100 and 222; // = 16 

Так что, казалось бы, битовые операторы на других языках не могут иметь одинаковый уровень приоритета в C++, который будет вызывать головные боли, если перевод между языками. Возможно, предупреждение, выпущенное GCC, может быть немного более наглядным.