каково значение по умолчанию для типа данных int в c?

#include <stdio.h>

void main(int x)
{

    printf("%d",x);
    
    return 0;
}

Если мы напечатаем значение x в функции main(), оно покажет 0, а значение int по умолчанию равно 0. Когда я добавляю int x в качестве параметра в main(), оно печатает значение x равное 1. Почему?


person Lingaraj sahoo    schedule 24.11.2020    source источник
comment
Отвечает ли это на ваш вопрос? Что означает int argc, char *argv[]?   -  person Uriya Harpeness    schedule 24.11.2020
comment
Я никогда раньше не видел такого main, но я думаю, что он даст 1, так как первый аргумент для main может быть argc   -  person csavvy    schedule 24.11.2020
comment
main получает два параметра, argc и argv, посмотрите их значение здесь: stackoverflow.com/questions/3024197/.   -  person Uriya Harpeness    schedule 24.11.2020
comment
поскольку значение int по умолчанию равно 0, почему вы так думаете? Там нет значения по умолчанию. Доступ к неинициализированной переменной является поведением undefined.   -  person William Pursell    schedule 24.11.2020
comment
@WilliamPursell Если только он не статичен   -  person klutt    schedule 24.11.2020


Ответы (2)


Afaik в размещенной среде единственными допустимыми основными прототипами являются:

void main(void);
void main(int argc, char* argv[]);

Все остальное (включая ваш пример) является неопределенным поведением.

В локальной области переменная унифицирована. Чтение из него приводит к неопределенному поведению.

В глобальном масштабе переменная int по умолчанию инициализируется значением 0.

person bolov    schedule 24.11.2020

поскольку значение int по умолчанию равно 0

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

когда я добавляю int x в качестве параметра в main(), он печатает значение x равное 1. Почему?

Ну, int main(int) недопустимая подпись. Два допустимых: int main(void) и int main(int, char**). А когда вы выберете второе, то первым аргументом будет количество переданных программе аргументов. И первый аргумент — это имя программы. Итак, этот код:

int main(int argc, char **argv) {
    puts(argv[0]);
}

напечатает что-то вроде

$ ./a.out
a.out
person klutt    schedule 24.11.2020