LINUX.ORG.RU

Особенности инициализации переменных в c/c++

 ,


0

4

Прошу консультации у знатоков. Т. к. сам не могу понять в чем разница между тремя вариантами инициализации переменных.

1:

int a = 0,
    b = 0,
    c = 0;


2:
int a,
    b,
    c = 0;


3:
int a = 0;
int b = 0;
int c = 0;


Первые два приводят к тому, что переменные a, b содержат мусор, и только третий вариант работает как положено. В теории все три варианта равнозначны. Или нет?

★★

Или нет?

Нет.

Первые два приводят к тому, что переменные a, b содержат мусор

В первом варианте должны быть нули во всех указанных переменных.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

В первом варианте должны быть нули во всех указанных переменных.

Я тоже так думал. А оказалось, что он оно чо! Второй вариант был контрольный выстрел после выноса моска в результате применения первого.

ЗЫ:
Проверялось на компиляторе vc++ под винду. Завтра попробую проверить под linux на gcc.

Attila ★★
() автор топика
Ответ на: комментарий от Attila

А оказалось, что он оно чо!

Не верю, vc++ каличный, не не настолько. Что-то не то проверялось. Для проверки сгодится и online-компилятор.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

a = b = c = 0;

Спасибо! Вариант 2 отпал, как вариант :)

Attila ★★
() автор топика

а вот если переменных 100...
int a0=.., a1=.. ;
или как кому удобно?
или через вектор?
vector<int> v = {.., .., .., ...};

Deleted
()
Ответ на: комментарий от neon1ks

Это не инициализация.

Но хорошее подспорье для таких нубов как я.

Attila ★★
() автор топика
Ответ на: комментарий от Attila

Проверялось на компиляторе vc++ под винду. Завтра попробую проверить под linux на gcc.

wandbox.org

KennyMinigun ★★★★★
()
Ответ на: комментарий от RazrFalcon

C++ или миллион способов инициализации.

... и еще два миллиона способов неинициализации.

KennyMinigun ★★★★★
()
Ответ на: комментарий от tailgunner

Но на венде есть и GCC - проверь им.

Есть у меня в дистре strawberry perl minGW gcc. Буду вспоминать как из командной строки запустить сборку из нескольких файлов. Черт знает сколько уже полноценно не пользовался консолью, а gcc вроде даже ни разу не запускал руками.

Attila ★★
() автор топика

Первые два приводят к тому, что переменные a, b содержат мусор

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

anonymous
()
Ответ на: комментарий от Attila

Проверялось на компиляторе vc++ под винду. Завтра попробую проверить под linux на gcc.

Есть божественный сайт, которым просто обязан пользоваться любой плюсовик: https://godbolt.org/

Если ты им не пользуешься - ты студент-любитель.

anonymous
()
Ответ на: комментарий от mittorn

под 6 разными браузерами

У тебя там музей браузеров?

UPD Если не доверяешь «говносайтам», задеплой сам, сорцы открыты: https://github.com/mattgodbolt

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от mittorn

Твой говносайт не работает у меня под 6 разными браузерами

Называть творение Годболта говносайтом - это надо с головой не дружить, впрочем, как и для того, чтобы убить свою ОС, чтобы в ней браузер не работал.

P.S. У меня Debian testing, хромиум из репозитория и все, что надо, работает.

anonymous
()
Ответ на: комментарий от KennyMinigun

Ну можно и так сказать. Относительно свежий только pale moon.

mittorn ★★★★★
()
Ответ на: комментарий от anonymous

Если ты им не пользуешься - ты студент-любитель.

Почти :)
Я вообще не программер, так, занимаюсь гимнастикой ума, чтобы моск не кис и по-ходу пытаюсь помогать «врубаться в тему» сыну, который поступил в техникум (по-модному колледж) на специальность — программист.

Attila ★★
() автор топика
Ответ на: комментарий от Attila

Я вообще не программер, так, занимаюсь гимнастикой ума

Тогда тут расклад такой: если ты хочешь разобраться с C++ всерьез - то придется стать профессиональным программистом и заниматься этим фултайм (слишком много нужно знать). Если же разбираться с C, то тут есть вариант быть профессионалом в чем-то другом (разработке железа, например) и одновременно хорошо программировать на сях.

anonymous
()
Ответ на: комментарий от anonymous

Если же разбираться с C, то тут есть вариант быть профессионалом в чем-то другом

Так сказал заковыристо, выгдятит, что кусок говна в виде C++ нечто годное.

anonymous
()
Ответ на: комментарий от Attila

Да ты гонишь. Проверил на VS 2015, в первом варианте нули, и не могло быть иначе.

anonymous
()
Ответ на: комментарий от Attila

листайте классику (не новыую классику) . а кондовую классику - то бишь не моложе ДонКиХота и прочего Шекспира.

а тс твой даже не ловля блох.

anonymous
()

Фигачь их в global scope и не нужно будет инициализировать нулями =D

anonymous
()
Ответ на: комментарий от Virtuos86

Для инициализации массива нулями в С++11 и новее можно использовать

int arr[100] = {0};

Для динамического массива есть функция

calloc()

neon1ks ★★
()
Ответ на: комментарий от neon1ks

Скорее std::array. В C++17 можно даже размер не указывать. Прогресс!

RazrFalcon ★★★★★
()
Ответ на: комментарий от Virtuos86

За дискуссией следи внимательно, ни один разумный программист не будет создавать 100 интов переменными, для этого минимум есть массивы.

fluorite ★★★★★
()
Ответ на: комментарий от neon1ks
int arr[100] = {0};

Это работает даже в C89. И даже это:

int a = {0};
int b = {0};
int c = {0};

xaizek ★★★★★
()
Ответ на: комментарий от fluorite

За дискуссией следи внимательно, ни один разумный программист не будет создавать 100 интов переменными

В дискуссии были вполне однозначно сказано «100 переменных». Про массив - это домыслы.

tailgunner ★★★★★
()
Ответ на: комментарий от fluorite

ни один разумный программист

это не всегда удовлетворяющееся условие

Virtuos86 ★★★★★
()
Ответ на: комментарий от neon1ks

Для инициализации массива нулями в С++11 и новее можно использовать
int arr[100] = {0};

int arr[100] {};
anonymous
()

Первый и третий равнозначны. Но третий является более наглядным. Я предпочитаю третий.

Второй вариант инициализирует только c.

andreyu ★★★★★
()
Ответ на: комментарий от mittorn

Твой говносайт не работает у меня под 6 разными браузерами

Вы какой-то особенный.

andreyu ★★★★★
()

Да когда вы уже перестанете пургу гнать со своим "C/C++"?

Ничего, что это — два абсолютно разных языка программирования? Какого хрена их через черточку пишут?

Это все равно, что писать фортран/жабоскрипт!

anonymous
()
Ответ на: комментарий от neon1ks

Для инициализации массива нулями в С++11 и новее можно использовать
int arr[100] = {0};

Такая инициализация массива была задолго до C++11.

andreyu ★★★★★
()
Ответ на: комментарий от SR_team

2013 и позднее инициализирует нулями, если значение не указано

В дебаге? В релизе там может быть что угодно.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.