2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Что может быть проще sizeof в C?
Сообщение23.12.2005, 00:57 


27/11/05
183
Северодонецк
Представим себе такой фрагмент:

char m[10];

int func(int p)
{
return(p / 10);
}

int func1(int p)
{
return(p / sizeof(m));
}

Если не считать упреков, что нельзя использовать магические числа (в данном случае
размер массива 'm'), неужели функция func1 более корректна, чем func?

 Профиль  
                  
 
 
Сообщение23.12.2005, 01:21 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Я не очень понимаю смысл примера, но обычно руководствуюсь простым соображением - по мере возможности использовать доступные в языке атрибуты объекта (переменной). С этой точки зрения
Код:
#define SZ 10
char c[SZ];
...
int x = SZ;
хуже, чем
Код:
char c[10];
...
int x = sizeof(c);

Причина проста - в языке нет органической связи между SZ и с. В момент написания программы можно все помнить и отладить, но через три года другой человек может что-либо нарушить. Меня очень огорчает то, что нельзя написать
Код:
T x;
...
typeof(x) y = x; // typeof(x) == typeof(y) == T

поскольку это давало бы гарантию правильности типа y (например, там, где y - временная копия x) вне зависимости от изменения типа x в будущем.

Все это особенно играет, когда T по каким-то причинам раcщепляется на T и Т1 (например, выведенный из T), и надо решить по всей большой программе, где надо менять. В этом случае правильность соотвествия заданная через общий внешний идентификатор может нарушиться.

В некотором смысле, это можно рассматривать как распространение объектно- ориентированного подхода на время разработки и компиляции.

 Профиль  
                  
 
 
Сообщение23.12.2005, 08:25 


27/11/05
183
Северодонецк
Смысл примера в том, что я хотел привлечь внимание к тому, что sizeof возвращает значение
unsigned, а вовсе не int, о чем многие забывают. Поэтому можно получить неожиданный
результат, когда отрицательное число делится на sizeof. Приведенные функции будут
возвращать один и тот же результат при входных положительных параметрах и разные
при отрицательных. Чтобы они работали одинаково, надо применить (int)sizeof()

 Профиль  
                  
 
 
Сообщение23.12.2005, 08:27 


27/11/05
183
Северодонецк
Смысл примера в том, что я хотел привлечь внимание к тому, что sizeof возвращает значение
unsigned, а вовсе не int, о чем многие забывают. Поэтому можно получить неожиданный
результат, когда отрицательное число делится на sizeof. Приведенные функции будут
возвращать один и тот же результат при входных положительных параметрах и разные
при отрицательных. Чтобы они работали одинаково, надо применить (int)sizeof()

 Профиль  
                  
 
 
Сообщение23.12.2005, 08:44 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
bekas писал(а):
Смысл примера в том, что я хотел привлечь внимание к тому, что sizeof возвращает значение unsigned, а вовсе не int, о чем многие забывают.

O-o! Лично я не понял. На всякий случай -- sizeof() возвращает значение типа size_t, а не unsigned int. Это может быть и signed int -- я встречал (хотя и экзотические) варианты C. В них адресация была (и указатель был) signed int32. RISC'и однако -- дело рисковое. Это может быть и unsigned long (последние стандарты отошли от совместимости int и void*, что логично), так что рекомендовать конструкцию (int)sizeof() я бы не стал. В крайнем случае, с использованием size_t.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group