Может ли компилятор пропустить вычисление левого операнда оператора запятой?
Оптимизация компилятора может иногда пропускать оценку определенных операторов, которые не имеют никакого значения. Однако относится ли это и к оператору запятой?
Следующий код работает без ошибок на ideone, но я ожидал, что он вылетит.
#include <iostream>
int main() {
int x = (1/0, 2);
std::cout << x << std::endl;
}
Программа вылетает, если я изменяю оператор на int x = 1/0;
1 ответ
При оптимизации компилятора используется правило " как если".
Правило как будто
Позволяет любые и все преобразования кода, которые не изменяют наблюдаемое поведение программы
Так что да, компилятор может оптимизировать это. Проверьте следующий измененный образец:
#include <iostream>
int main()
{
int y = 1;
int x = (y=1/0, 2);
std::cout << x << std::endl;
//std::cout << y << std::endl;
}
Комментирование последней строки компилирует и выполняет этот код правильно, а комментирование дает ожидаемое неопределенное поведение.
Как правильно указывает @jogojapan,
Важно отметить, что оптимизация компилятора не гарантируется стандартом, и деление на ноль является неопределенным поведением. Так что этот код имеет неопределенное поведение. Мы не можем знать, является ли наблюдаемое поведение из-за того, что компилятор оптимизирует деление на ноль, или из-за неопределенного поведения. Технически, это все же неопределенное поведение.