g cc приложение работает нерегулярно, но clang работает нормально - PullRequest
0 голосов
/ 12 июля 2020

Я написал простую виртуальную машину на основе стека, вы можете просмотреть ее исходный код по адресу https://github.com/radinParsaei/VM, когда я компилирую ее с помощью clang, она работает хорошо, но если она компилируется с G CC в байт-кодах, которые я закодировал например, pop() / pop(), он работает нерегулярно и возвращает stack[stack.size() - 2] / stack[stack.size() - 1]. Я исправляю это, написав этот код, например Value a = pop(); Value b = pop(); return a / b;, у кого-нибудь есть идея получше?

1 Ответ

2 голосов
/ 12 июля 2020

Как говорит @IlCapitano, ваш второй pop() может вызываться первым:

В C ++ нет концепции оценки слева направо или справа налево. Это не следует путать с ассоциативностью операторов слева направо и справа налево: выражение a () + b () + c () разбирается как (a () + b ()) + c () из-за ассоциативности слева направо оператора +, но вызов функции c может быть оценен первым, последним или между a () или b () во время выполнения

Ключ: вызов функции c может быть оценен первым, последним или между a () или b () во время выполнения .

В ответ на комментарий:

порядок оценки не указан (за некоторыми исключениями). Компилятор может вычислять операнды и другие подвыражения в любом порядке и может выбрать другой порядок при повторном вычислении того же выражения.

Так что это зависит от компилятора. Каждый делает это по-своему.

...