Thu Jan 27 2005 17:15, Harry Zhurov wrote to Genadi Zawidowski:
HZ> From: "Harry Zhurov" snipped-for-privacy@online.nsk.su>
HZ> Thu, 27 Jan 2005 16:43:04 +0300 Genadi Zawidowski wrote to Leha HZ> Bishletov:
LB>>>>> i=(&(a[1]))-(&(a[0])); LB>>>>> i=(a+1)-(a); GZ>>>> по стандарту - количество элементов между двумя указателями
LB>>> Честно говоря, не знал. А как по стандарту трактуются такие выражения:
LB>>> int a[4], *ip1, *ip2;
LB>>> ip2-ip1 = ? LB>>> (a+1)-ip1 = ?
GZ>> "по стандарту" результат таких выражений определен, если сравниваются GZ>> или вычитаются адреса элементов одного массива между собой.
HZ> А что, если
HZ> extern int i1; HZ> extern int i2;
HZ> ... HZ> ip1 = &i1; HZ> ip2 = &i2;
HZ> то ip1 - ip2 не определено, что-ли? Вполне определено - конкретное HZ> число получится. Модуль этого числа указывает, сколько интов помещается в HZ> кусок памяти между адресуемыми переменными. Другое дело, что какого-то HZ> практического смысла в этом не видно.
Hу не на всех архитектурах линкер будет инты выравнивать на их размер... представь себе, между ними будет некратное число... остаток от деления... Правильно, сравнивать два таких адреса смысла нет. А разработчиков компилятра этот пункт избавляет от необходимости правильно обрабатывать такие случаи. Да, там еще специально оговаривается, что допустимо использовать в таких вычислениях адрес сразу за последним элементом.
int a[10]; int d = a [10] - a[5]; assert(d == 5);
Этот код правильный. А если изменить на
int d = a [11] - a[5];
то уже нет.
Генка на сервере pochtamt.ru в ящике mgs2001