Почему результат разный при одинаковых стандартах языка С++?

Рейтинг: 2Ответов: 1Опубликовано: 25.03.2023

В Microsof Visual Studio (2022, версия 17.4.4) запустил следующую программу:

#include <iostream>

class my_stack
{
    static const int MAX_SIZE = 100;

    int stack[MAX_SIZE];
    int size;

public:
    void push(int a)
    {
        stack[size++] = a;
    }
    int pop()
    {
        return stack[--size];
    }
    my_stack()
    {
        size = 0;
    }
};

int main()
{
    my_stack st;
    for (int i = 0; i < 5; ++i)
    {
        st.push(i);
    }
    std::cout << st.pop() << (st.pop(), st.push(6), st.pop()) << st.pop();
    return 0;
}

Результат работы при стандартах языка C++14 и C++17 - 236 и 462 соответственно. То же самое запустил в VS Code на Linux/Ubuntu (22.04.02 LTS) на C++ стандарта C++14 и C++17 компилятора g++, но результат только 462, причём при любой другой версии (C++98, C++11, C++20, C++23) - то же самое.
(стандарт языка задавал в tasks.json через -std=)

  • Почему резльтаты разные???
  • Файлы .vscode:
  1. tasks.json:
{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "-std=c++17"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger.",
            "presentation": {
                "clear": true
            }
        }
    ],
    "version": "2.0.0"
}
  1. c_cpp_properties.json (вроде он лишний, но всё равно добавлю)
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "linux-clang-x64",
            "configurationProvider": "ms-vscode.makefile-tools"
        }
    ],
    "version": 4
}

Ответы

▲ 5

Все дело в том, что в С++17 порядок вычисления в

std::cout << st.pop() << (st.pop(), st.push(6), st.pop()) << st.pop();

определен строго, а в С++14 — нет. Вот каждый компилятор по-своему и работает...