История изменений
Исправление firkax, (текущая версия) :
А еще для одного языка может быть несколько разных компиляторов и они совершенно не обязаны подчиняться «комитету-стандартописателей».
Верно.
Поясняющий пример такой:
#include <stdio.h>
int main(void) {
signed char a, b;
a = 100;
b = 100;
a += b;
if(a>100) printf ("a>100");
else printf("a<100");
return 0;
}
В режиме no-strict-overflow (который совпадает с машинным представлением чисел) будет выведено a<100. В режиме strict-overflow, который автоматически включается ключом -O2 у gcc, который подразумевается в C89/C99/C11 и который в каком-то другом компиляторе может оказаться дефолтным или вообще неотключаемым - тут получается UB и он может вывести любую из надписей (хотя конкретно этот пример на моём gcc10 стабильно выдаёт a<100 но это не гарантируется), или вообще непредсказуемо сломать порядок выполнения.
Побитово это не объяснить, потому что компилятор может тупо выкинуть if или заменить условие в нём на другое, которое ты не писал, но которое, по мнению компилятора, будет давать тот же результат если не случилось переполнение.
Ты же создал тему изначально про неявные «нюансы» арифметики, которые для тебя ... являются неожиданным открытием.
Нет, не являются. С чего ты взял?
Исходная версия firkax, :
А еще для одного языка может быть несколько разных компиляторов и они совершенно не обязаны подчиняться «комитету-стандартописателей».
Верно.
Поясняющий пример такой:
#include <stdio.h>
int main(void) {
signed char a, b;
a = 100;
b = 100;
a += b;
if(a>100) printf ("a>100");
else printf("a<100");
return 0;
}
В режиме no-strict-overflow (который совпадает с машинным представлением чисел) будет выведено a<100. В режиме strict-overflow, который автоматически включается ключом -O2 у gcc, который подразумевается в C89/C99/C11 и который в каком-то другом компиляторе может оказаться дефолтным или вообще неотключаемым - тут получается UB и он может вывести любую из надписей (хотя конкретно этот пример на моём gcc10 стабильно выдаёт a<100 но это не гарантируется), или вообще непредсказуемо сломать порядок выполнения.
Побитово это не объяснить, потому что компилятор может тупо выкинуть if или заменить условие в нём на другое, которое ты не писал, но которое, по мнению компилятора, будет давать тот же результат если не случилось переполнение.