Где разница в компиляции между 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 шт):

Автор решения: AlexGlebe

Разные результаты от разного порядка вычисления аргументов. Стандарт не оговаривает, какой аргумент нужно вычислять первым. И разные компиляторы это делают по-своему.
Чтобы понять надо посмотреть пошагово. Вот как вычисляет 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
→ Ссылка
Автор решения: Stanislav Volodarskiy

Выражение 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
→ Ссылка