Где разница в компиляции между gcc (Debian) и MS VS 2017 (Win10)
#include <stdio.h>
void main() {
int a = 2;
a = a++ + ++a;
printf("%d", a);
}
В линуксе: 6
В win10 (компилятор MS Visual Studio Community 2017): 7
Как получается "7" - не могу найти объяснения
Ответы (2 шт):
Разные результаты от разного порядка вычисления аргументов. Стандарт не оговаривает, какой аргумент нужно вычислять первым. И разные компиляторы это делают по-своему.
Чтобы понять надо посмотреть пошагово. Вот как вычисляет gcc :
a++ => 2 // a == 2 (пост - инкремент)
++a => 3 // a == 3 (пре - инкремент)
a = 2 + 3 // a == 5
// после окончания вычислений происходит пост - инкремент a++
a = a + 1 // a == 6
а вот MS наоборот :
++a => 3 // a == 3 (пре - инкремент)
a++ => 3 // a == 3 (пост - инкремент)
a = 3 + 3 // a == 6
// после окончания вычислений происходит пост - инкремент a++
a = a + 1 // a == 7
Выражение a = a++ + ++a; приводит к неопределённому поведению. Это значит что результат может быть любым на любом компиляторе, даже отличаться при различных запусках одной и той же программы.
Рассуждать о работе программы с неопределённым поведением - тратить время зря.
Правильно настроенный компилятор отказывается обрабатывать такой код:
// gcc -std=c11 -pedantic -Wall -Wextra -Werror temp.c
int main() {
int a = 2;
a = a++ + ++a;
}
$ gcc -std=c11 -pedantic -Wall -Wextra -Werror temp.c temp.c: In function ‘main’: temp.c:5:7: error: operation on ‘a’ may be undefined [-Werror=sequence-point] 5 | a = a++ + ++a; | ~~^~~~~~~~~~~ temp.c:5:7: error: operation on ‘a’ may be undefined [-Werror=sequence-point] cc1: all warnings being treated as errors