Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9

Инициализация vs Присваивания. Если ли разница?

13.11.2019, 08:24. Показов 10076. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Читал книгу по Си ещё 1998 года:
C
1
тип имя_переменной = начальное_значение;
Этот приём назван инициализацией. В отличие от присваивания, которое осуществляется в процессе выполнения программы, инициализация выполняется при выделении для переменной участка памяти.
Однако, мне кажется, что разницы (в современных компиляторах) нет. Ассемблерный код подтверждает мою догадку:
C
1
2
int a, b=2;
a = 1;
ARM64:
Assembler
1
2
3
4
        mov     w0, 2
        str     w0, [sp, 12]
        mov     w0, 1
        str     w0, [sp, 8]
x86-64:
Assembler
1
2
        movl    $2, -8(%rbp)
        movl    $1, -4(%rbp)
Уже стало неактуально? А какой раньше генерировали компиляторы код, что была разница между инициализацией и последующим присваиванием?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.11.2019, 08:24
Ответы с готовыми решениями:

Инициализация копированием () и присваиванием =. В чем разница?
в чем разница инициализации в скобках от инициализации присваиванием? int a=5; int b(5); //в чем разница от первого варианта? int...

Инициализация полей - в чем разница двух приведенных реализаций
class first { public first() { a=5; b="строка"; } int a; string b;

Какая разница между возвращением значения и присваивания значения?
Какая разница между возвращением значения и присваивания значения? Я всегда думал, что возвращение это одно и тоже что и присваивание, но...

25
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.11.2019, 10:35  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Evg Посмотреть сообщение
инициализация позволяет построить агрегат (т.е. составной объект: структуру или массив).
Для присваивания аналогичный конструкций на уровне синтаксиса нет
Интересный ньюанс языка Си. Пришлось много поразмышлять. Спасибо, было интересно узнать новое/взглянуть с другой точки зрения.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
в те времена, если мне память не изменяет, в Си нужно было объявлять(инициализировать) все переменные в начале блока, в отличии от плюсов
Да стандарты языка Си не слишком изменились (на мой взгляд). Я сейчас пишу под -std=c99.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
15.11.2019, 10:39
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В принципе, ответ уже был дан: разница есть и заключается в разрешенных оптимизациях.
В языке С нет и не может быть никакого деления на "разрешенные или запрещенные оптимизации". Оптимизации в С всегда безусловно разрешены спецификацией языка.

"Запрещенные оптимизации" бывают только в чисто утилитарных контекстах - чтобы помочь вам в пошаговой отладке вашего кода, когда вы сами этого попросите именно с этой целью. Никакого отношения к рассматриваемому вопросу это, разумеется, не имеет.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
15.11.2019, 10:49
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Да стандарты языка Си не слишком изменились (на мой взгляд).
в том то и дело что сильно
если взять стандарты языка времен K&R то объявление функций вообще имеет другой вид, какой сейчас не скажу, не помню
и если взять такую конструкцию
C
1
2
3
4
5
{
int a=5;
for(int i=0;i<10;i++);
int b=10;
}
то тот же Keil без ключа --c99 начнет верещать
ему подавай
C
1
2
3
4
5
{
int b,i,a=5;
for( i=0;i<10;i++);
 b=10;
}
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Я сейчас пишу под -std=c99.
во во 99! а книга 98 года издания, значит писалась еще раньше, да еще посмотри нет ли таких слов "издание второе стереотипное"
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
15.11.2019, 11:10
Цитата Сообщение от Evg Посмотреть сообщение
инициализация позволяет построить агрегат (т.е. составной объект: структуру или массив).
Для присваивания аналогичный конструкций на уровне синтаксиса нет.
Ну начиная с C99 у нас есть составные литералы и, как следствие, возможность использовать аналогичную конструкцию для присваивания структур

C
1
2
3
4
5
6
7
struct S { int x, y; };
 
void foo(void)
{
  struct S s = { 1, 2 };   // инициализация
  s = (struct S) { 3, 4 }; // присваивание
}
Для массивов присваивания нет, но это опять же не следствие отсутствия синтаксиса, а следствие общей неприсваиваемости голых массивов.
3
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,091
15.11.2019, 13:10
Цитата Сообщение от ValeryS Посмотреть сообщение
или поэлементно запихиваем или все чохом
Хорошо, согласен. Тут компилятор действительно не желает оптимизировать.
Вернемся к глобальному объявлению отдельных переменных: при инициализации значения раскладываются в отдельный сегмент, а при присваивании остаются в коде.
Цитата Сообщение от ValeryS Посмотреть сообщение
если взять стандарты языка времен K&R то объявление функций вообще имеет другой вид, какой сейчас не скажу, не помню
Как-то так
C
1
2
3
4
5
6
main(argc, argv)
int argc;
char **argv;
{
  
}
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Да стандарты языка Си не слишком изменились
В целом да. По большей части добавили проверок, связанных с безопасностью (отказ от неявного int, выкидывание gets и т.п.) и добавили плюшек вроде объявления переменных где угодно, однострочных комментариев и vla.
Значительно меньше изменений, чем в других языках.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
возможность использовать аналогичную конструкцию для присваивания структур
Спасибо. Про такую возможность не знал. Хотя мог бы догадаться: раз функция может вернуть структуру, что мешает просто присваивать структуры.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
15.11.2019, 19:31
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ну начиная с C99 у нас есть составные литералы
Честно говоря, я думал, что это GNU-расширение. Не знал, что они уже в стандарт вошли

Добавлено через 51 минуту
Точнее не так. Изначально это и было GNU-расширением. Но потом он попало в стандарт, что произошло со многими GNU-расширениями. Но я не знал, что оно попало в стандарт (или забыл уже об этом)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2019, 19:31

Инициализация в теле конструктора или в списке инициализации, есть ли разница в сгенерированном коде?
Инициализация в теле конструктора или в списке инициализации - большая ли разница в сгенерированном коде? И есть ли она вообще?

Нужно ли реализовать также отдельно конструктор копирования, если имеется перегруженный оператор присваивания?
у меня есть класс. и прототип перегруженной операции присваивания some_class&amp; some_class::operator=(const some_class&amp;...

Если a=true и x=1, то какое значение получит логическая переменная d после выполнения оператора присваивания
а) d:=x&lt;2; б)d:=not a or odd(x); в)d:=odd(a)&lt;&gt;x Вычислить значение логических выражений 1) t and (P mod 3=0 ) при t=true ,...

Написать оператор присваивания, в результате которого логическая переменная t получает значение false, если выполняется указанное условие: числа x, y
Написать оператор присваивания, в результате которого логическая переменная t получает значение false, если выполняется указанное условие:...

Если, то разница со знаком минус
Здравствуйте! Подскажите можно ли в ячейку Z прописать формулу такого вида: Если цифра в ячейке АА больше цифры в ячейке Y, то разница...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru