2014 dxdy logo

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

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




 
 Что может быть проще sizeof в C?
Сообщение23.12.2005, 00:57 
Представим себе такой фрагмент:

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 
Аватара пользователя
: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 
Смысл примера в том, что я хотел привлечь внимание к тому, что sizeof возвращает значение
unsigned, а вовсе не int, о чем многие забывают. Поэтому можно получить неожиданный
результат, когда отрицательное число делится на sizeof. Приведенные функции будут
возвращать один и тот же результат при входных положительных параметрах и разные
при отрицательных. Чтобы они работали одинаково, надо применить (int)sizeof()

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

 
 
 
 
Сообщение23.12.2005, 08:44 
Аватара пользователя
: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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group