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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2016, 13:17   #1
serres
Пользователь
 
Регистрация: 04.11.2007
Сообщений: 77
По умолчанию Обьявление переменых в цикле

Поянить пожалуйста, почему в C языке не жедательно обьялеть переменые в цикле?

имею виде вот такой вот пример:

Код:
for (i = 0; i < CONST_NUM; i++)
{
   st_obj *obj = X;
   ...
}
serres вне форума Ответить с цитированием
Старый 04.12.2016, 13:28   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Все как и в других языках. Запрета нет, но надо быть готовым к последствиям - на каждой итерации будет вызываться конструктор и деструктор, возможно.
В вашем примере где объявлять разницы нет, указатель это простой тип и компилятор, скорее всего, поместить его в один из регистров в любом случае.
p51x вне форума Ответить с цитированием
Старый 04.12.2016, 13:33   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Кроме того, эта переменная не будет видна вне тела цикла, хотя иногда это плюс.
waleri вне форума Ответить с цитированием
Старый 04.12.2016, 13:53   #4
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Все как и в других языках. Запрета нет, но надо быть готовым к последствиям - на каждой итерации будет вызываться конструктор и деструктор, возможно.
В языке C, в отличие от C++, нет даже понятий таких как конструктор и деструктор.
olej.tsil вне форума Ответить с цитированием
Старый 04.12.2016, 13:56   #5
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от serres Посмотреть сообщение
почему в C языке не жедательно обьялеть переменые в цикле?
1. во-первых, не до конца понятно какие переменные вас беспокоят, о чём речь: о параметре цикла for ... или о локальных переменных внутри блока кода? точнее нужно спрашивать...

2. а во-вторых ... а кто вам такую глупость сказал?
olej.tsil вне форума Ответить с цитированием
Старый 04.12.2016, 15:02   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от olej.tsil Посмотреть сообщение
В языке C, в отличие от C++, нет даже понятий таких как конструктор и деструктор.
Формальных слов нет, а вот понятия есть. Например:
1. функция инициализатор
Код:
CoolStruct* CoolStruct_new(int id, int value) { 
  CoolStruct* p = malloc(sizeof(CoolStruct));
  p->id = id;
  p->value = value;
  return p;
}
2. в С99 и далее
Код:
CoolStruct newObj1 = (CoolStruct){ .value = init_value, .id = init_id };
Цитата:
а кто вам такую глупость сказал?
Любой вменяемый программист только с моей оговоркой о сложных типах. Проведите замеры выполнения хотя бы...
p51x вне форума Ответить с цитированием
Старый 04.12.2016, 15:36   #7
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Кроме того, эта переменная не будет видна вне тела цикла, хотя иногда это плюс.
Это почти всегда плюс.
olej.tsil вне форума Ответить с цитированием
Старый 04.12.2016, 15:45   #8
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Формальных слов нет, а вот понятия есть.
И понятия такого нет
(кроме, пожалуй, единственного случая - в POSIX собственные данные потока, TSD, где и упоминается, но очень специфически, о деструкторах)
Цитата:
Сообщение от p51x Посмотреть сообщение
2. в С99 и далее
Код:
CoolStruct newObj1 = (CoolStruct){ .value = init_value, .id = init_id };
Это элементарное выделение структуры в стеке с инициализацией данных, ничем не отличающееся от более наглядного:
Код:
CoolStruct newObj1 = (CoolStruct){ init_value, init_id };
Никакого конструктора там нет и в помине, и никакого зла такое объявление не привносит ... кроме несомненной пользы локализации объявления.
olej.tsil вне форума Ответить с цитированием
Старый 04.12.2016, 15:47   #9
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от serres Посмотреть сообщение
Поянить пожалуйста, почему в C языке не жедательно обьялеть переменые в цикле?
Выделяйте, юноша, локальные переменные всегда, когда вы можете объявить их локальными.
olej.tsil вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обьявление метки ramzes777 Общие вопросы Delphi 11 01.10.2011 17:28
программа должна находить минимум функции нескольких переменых Pashok7 Помощь студентам 1 05.04.2011 15:46
Область видимости переменых объявленых в цикле for lion#1 Общие вопросы C/C++ 13 03.04.2009 17:40
Обьявление массива bondik Общие вопросы C/C++ 1 31.03.2009 19:09
обьявление классов пыхонин филипп Помощь студентам 1 21.03.2009 20:10