Может ли компилятор пропустить вычисление левого операнда оператора запятой?

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

Следующий код работает без ошибок на 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,
Важно отметить, что оптимизация компилятора не гарантируется стандартом, и деление на ноль является неопределенным поведением. Так что этот код имеет неопределенное поведение. Мы не можем знать, является ли наблюдаемое поведение из-за того, что компилятор оптимизирует деление на ноль, или из-за неопределенного поведения. Технически, это все же неопределенное поведение.

Другие вопросы по тегам