Неоднозначное поведение различных компиляторов c ++ - PullRequest
0 голосов
/ 19 марта 2020

Когда вы делаете левый сдвиг числа -ve в Leetcode, он показывает ошибку времени выполнения, как показано на следующем снимке экрана Вывод компилятора Leetcode

Теперь для того же кода в IDE GeeksForGeeks, это работает хорошо, как показано ниже GFG IDE Вывод с тем же кодом

Такое же поведение наблюдается, когда я отправляю тот же код в IDE блоков кода. Мой вопрос, почему эта неоднозначность в выходных данных , Пожалуйста, помогите, я очень запутался после прочтения различных сообщений о сдвиге влево в c ++ на soft Подробное объяснение будет полезно.

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Существует "неопределенное поведение" и "поведение, определяемое реализацией" в C, C ++, Objective- C.

«неопределенное поведение» означает, что может произойти что угодно . Не только то, что вы считаете разумным или ожидаемым, но что-нибудь . НЕ ДЕЛАЙТЕ ЭТОГО.

«поведение, определяемое реализацией» означает, что ваш компилятор должен задокументировать, что он будет делать в этой ситуации. Вы читаете документацию компилятора. Разные компиляторы могут делать это по-разному.

Этот (сдвиг влево отрицательного числа) является неопределенным поведением. Правило: не делай этого. Не жалуйтесь на результат. Если он кусает тебя сзади, ты можешь винить только себя.

0 голосов
/ 19 марта 2020

Как ответили другие, сдвиг влево отрицательного значения со знаком является неопределенным поведением в стандарте C ++. Различные компиляторы будут обрабатывать неопределенное поведение по-разному.

Например, использование компилятора g ++ (G CC) 9.2.0 для вашего кода:

g++ test.cpp

не выдаст предупреждение.

Но вы можете использовать другую опцию для компилятора, если вы включите все предупреждения и воспринимаете предупреждение как ошибку в g ++:

g++ -W -Wall -Werror test.cpp

Компилятор выдаст ошибку при компиляции кода.

Эти веб-сайты могут использовать разные компиляторы и опции, подчеркивающие их интерфейс и, таким образом, приводящие к разным результатам. Если вы хотите больше узнать о компиляторе, возьмите один и попробуйте использовать другие опции в автономном режиме.

...