Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2013, 03:11   #1
newgeniy
 
Регистрация: 09.02.2013
Сообщений: 6
Печаль Что такое инициализация?

Вообщем я дико извиняюсь за столь начальный вопрос
но предупреждаю :
что на форуме искал ответы на вопрос но не нашел его
те ответы что дает выдача ПС мне пока не особо помогла их теория

Что есть инициализация ? учу я php ,но данный термин и процесс как я понимаю относится ко всем языкам программирования . Очень хотелось бы что бы настоящие программисты объяснили на пальцах чтоли, что за вещь .
Например что значит инициализировать переменную и что вообще значит инициализировать.
Если тема не подходит к теме раздела форума прошу не удалять а перенести в релевантную ветку.
newgeniy вне форума Ответить с цитированием
Старый 09.02.2013, 05:29   #2
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Цитата:
Сообщение от newgeniy Посмотреть сообщение
Например что значит инициализировать переменную и что вообще значит инициализировать.
Инициализировать переменную - задать ее значение.
Также в принципе можно упомянуть о
- явной инициализации (задаваемая самим программистом)
- неявной инициализации (по умолчанию)
Пример (С/С++):
Код:
int sum=0; //явная инициализация переменной sum
int Sum; //пока что неявная инициализация переменной Sum (а точнее быть там лежит "мусор" или же неведомо что)

Последний раз редактировалось Базиля; 09.02.2013 в 05:33.
Базиля вне форума Ответить с цитированием
Старый 09.02.2013, 07:24   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Так же очень не рекомендуется надеяться на неявную инициализацию, лучше перестраховаться и сделать явную инициализацию..
Poma][a вне форума Ответить с цитированием
Старый 09.02.2013, 07:56   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Например что значит инициализировать переменную
Переменную можно объявить, не присваивая ей никакого значения. Т.е int i;. Если начать использовать её в таком виде, она будет иметь неопределённое значение, которое находится в памяти. Для того, что-бы она имела нужное нам значение, её нужно иниициировать, т.е. присвоить ей некоторое значение наприме i = 0;.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 09.02.2013, 15:26   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Что есть инициализация
Есть такая вещь, как оперативная память. Она хранит данные во время работы компьютера, которыми являются переменными программ, причем представляют их в разном виде. Это может быть массив(строка, например), число, цвет пикселя, или еще что-то. На самом деле это обыкновенные числа. Память поделена на байты. Каждый байт имеет свой адрес. Первый, апример, 0, второй 1 и т.д (как номера домов, телефона). Так, например, можно узнать, что хранится в пятом, десятом или 0xFF90. Обычно адреса представляют в шестнадцатеричной системе.
Есть в языках низкого уровня сегмент .data, в котором объявляют переменные. Что же происходит? Я уже говорил, что у памяти есть адреса, так вот объявляя переменную мы как бы резервируем у нее этот кусочек и используем его в дальнейшем. Т.е. объявляя переменную
Код:
int var
или как у Вас в php
Код:
$var
мы забираем себе кусочек памяти и даем ему имя, чтобы было удобно его использовать. Согласитесь, var - понятнее, нежели 0x000A1677. Выделив память, нам нужно ее использовать. Мы пишем $var=15, тем самым записываем в ячейку памяти число 15 - это и есть инициализация. Если переменной $var не существовало, то $var=15 объявит и инициализирует ее. Мы можем резервировать разное количество ячеек. Например: Байт(BYTE), два байта или слово(WORD), четыре байта или двойное слово(DWORD) и т.д. Переменная может занимать не один байт а два, четыре и более. Касаясь php, скажу, что то, о чем я Вам сказал немного не точно, т.к. php это серверный язык, который обрабатывается интерпретатором, поэтому механизм немного другой, но пока над этим не заморачивайтесь. Поймите вышесказанное.
Код:
int Sum; //пока что неявная инициализация переменной Sum (а точнее быть там лежит "мусор" или же неведомо что)
По идее компилятор позаботится об этом и вставит туда 0, но не факт, зависит от компилятора. Мне мусор не попадался, было как-то в FASM, когда я адресацией необъявленную область читал.
Проверил на g++ 4.4.5
Код:
#include <stdio.h>
int var;
int main(int argc,char * argv[])
  {
    printf("%i\n",var);
    return 0;
  }
Вывело 0.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 09.02.2013 в 15:54.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 09.02.2013, 23:51   #6
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

_PROGRAMM_
Попробуйте переменную объявить локально.


Интересно, почему глобальные по умолчанию нулевые, а в случае локальных компилятор не берет на себя такую ответственность ?

Последний раз редактировалось Базиля; 09.02.2013 в 23:55.
Базиля вне форума Ответить с цитированием
Старый 10.02.2013, 07:28   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
Интересно, почему глобальные по умолчанию нулевые, а в случае локальных компилятор не берет на себя такую ответственность ?
Тут дело не в компиляторе, а в конструкторе. Глобальная переменная, объявляется при запуске программы и автоматически получает статус static. Локальная переменная, объявляется динамически. И в конструкторе dynamic, такое действие не происходит. С чем это связано? А хрен его знает. Может в прошлом программисты не досмотрели. А в современных версиях не стали этот конструктор менять "для совместимости".
В общем моё ИМХО, это рудинимент С.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 10.02.2013, 07:35   #8
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Smitt&Wesson
Спасибо!
Базиля вне форума Ответить с цитированием
Старый 10.02.2013, 11:24   #9
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Попробуйте переменную объявить локально.
Все равно ноль получается.
Цитата:
Интересно, почему глобальные по умолчанию нулевые, а в случае локальных компилятор не берет на себя такую ответственность ?
Глобальные и локальные переменные размещаются в разных областях памяти. Глобальные - статически в основной памяти(гляньте в отладчике ollydbg), а локальные в стеке(stack). Физически они ничем не отличаются, но принцип работы немного иной. За stack отвечает регистр процессора esp, который указывает на вершину, т.е. в эта память работает по принципу: первый зашел, последний вышел и наоборот. В stack записываются данные и к регистру esp прибавляется количество записанных байт, как только мы их оттуда забираем, от esp отнимается количество взятых байт, но сами они не затираются. Вероятно, ваш компилятор, инициализируя локальную переменную просто прибавляет к esp ее размер, не записывая туда ноль. И вы, обращаясь к ней, получаете тот самый мусор.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 10.02.2013, 12:30   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от _PROGRAMM_ Посмотреть сообщение
Вероятно, ваш компилятор, инициализируя локальную переменную просто прибавляет к esp ее размер, не записывая туда ноль. И вы, обращаясь к ней, получаете тот самый мусор.
Именно. Просто по стек, я чёт забыл. Только не компилятор их туда пишет, а процедура, которая отвечает за это, в исполняемом коде. Компилятор лишь помещает коды этой процедуры в скомпилированный код.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что такое f. spezzA Паскаль, Turbo Pascal, PascalABC.NET 1 13.06.2011 16:21
Что такое хорошо, а что такое плохо... EL_MoC Microsoft Office Word 6 14.04.2011 18:49
Что такое @? k1r1ch Общие вопросы Delphi 11 11.09.2009 20:15
Что такое SE LOPKOT HTML и CSS 5 31.08.2009 21:50
то такое мастерство в программировании, что такое мастер программист и что он может? Cezar Свободное общение 29 02.06.2007 23:48