singlepost

Разница с/c++ << На главную или назад  

Всем доброго времени суток!
Возникла следующая задачка:
Есть ли разница в работе следующего кода скомпилированного с(си) компилятором и с++ компилятором.

int x;
int main() {
int y;
return 0;
}

Т.е. как будут инициализироваться эти переменные?
Есть подозрение, что если их объявить константными, то разницы не будет.

120 ответов в теме “Разница с/c++”

Страницы: [1] 2 3 4 5 6 7 8 »

  1. 1
    Иван Горбачев ответил:

    master@computer1 ~/temp/12 $ cat main.cpp
    int x;
    void main() {
    int y;
    }
    master@computer1 ~/temp/12 $ g++ main.cpp -omain
    main.cpp:2: ошибка: ‘::main’ должна возвращать ‘int’

    C++ не компилит данный код :) ))))

  2. 2
    Александр Васюченко ответил:

    ну да, main должен возвращать int на сколько я помню, это же код возврата для ОС

  3. 3
    Илья Тимофеев ответил:

    хм…компилятор из старой студии компилил… думаю что подвох был не в этом. сейчас изменю, что бы в заблуждение не вводило

  4. 4
    Анатолий Лютин ответил:

    Не проверял, но попробую угадать: и там и там x проинициализируется 0, а y – случайным числом. Сейчас проверю.

  5. 5
    Анатолий Лютин ответил:

    Проверил:
    [vostok@localhost ~/tmp]$ cat > a.cpp
    #include <iostream>

    using namespace std;

    int x;

    int main()
    {
    int y;

    cout << "x=" << x << " y = " << y << endl;
    return 0;
    }
    [vostok@localhost ~/tmp]$ g++ a.cpp -o a.exe
    [vostok@localhost ~/tmp]$ ./a.exe
    x=0 y = 134514633
    [vostok@localhost ~/tmp]$ cat > b.c
    #include <stdio.h>

    int x;

    int main()
    {
    int y;

    printf("x=%d:y = %d ", x, y );

    return 0;
    }
    [vostok@localhost ~/tmp]$ gcc b.c -o b.exe
    [vostok@localhost ~/tmp]$ ./b.exe
    x=0:y = -1208394544

  6. 6
    Анатолий Лютин ответил:

    Для тех кто в танке и даже не пытался открыть википедию, Керригана и Ричи или Страуструпа объясняю. И там и там x будет помещён при компиляции в тело программы (фактически при компиляции в конец исполняемого кода будет добавлена переменная x, которая, естественно, проинициализируется 0), смотрится это любым hex-редактором. Память на y же будет выделена только во время выполнения программы и, соответственно, проинициализируется тем, что случайно окажется в памяти из стека.

  7. 7
    Анатолий Лютин ответил:

    Да и ещё, про второй вопрос. Это бред, если вы их объявите константами, то вы обязаны будете им присвоить значения… Быстро обратно в школу учиться!

  8. 8
    Илья Тимофеев ответил:

    Да с константами это я лажанул :) Давно с этими языками дело не имел
    Спасибо большое за подробный ответ!

  9. 9
    Нгамдкхе Кверос ответил:

    Анатолий Лютин "переменная x, которая, естественно, проинициализируется 0"

    и где в ричи написано что неинициализированная глобальная переменная должна инициализироваться нулём?
    в досе и билдере совершенно точно бывали прецеденты когда люди закладывались на нули, а в один прекрасный момент после сборки туда начинало попадать что-то другое.(именно глобальная переменная которая не в стеке а сегменте данных лежит)

  10. 10
    Анатолий Лютин ответил:

    Поправьте меня, если я не прав, но в стандарте это прописано. Про Ричи я имел ввиду то, что там написано откуда какие переменные память берут, а это ключ к понимаю того, какие значение ожидать.

    Во времена доса и билдера каждый делал так как хотел, наплевав на стандарт (который, кстати, только в 89 появился). Чего только стоили программы с char *b = "blablabla"; b[0] = 'a'; Кстати, в некторых версиях ДОСА, такое допускалось ;)

Страницы: [1] 2 3 4 5 6 7 8 »

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.