Это нет неопределенного поведения
когда вы объявили *a, a указывает на ячейку памяти, *b = a++
; b, чтобы указать на то же местоположение, что и a, И увеличивает a, чтобы указать на местоположение, в 1 раз превышающее предыдущее местоположение, на которое указывает b.
b - a = -1
//правильно
я приведу пример
int main(void)
{
int *a; // 0x408
int *w = a++; // 0x400
int *b = a++; // 0x404
int c = (b-a);
printf("%d\n",b-a);// -1
printf("%d\n",w-a); // -2
return 0;
}
я представляю w
, чтобы лучше проиллюстрировать
Адрес памяти во время выполнения переменной будет похож на приведенный выше.
b - a
( 0x404 - 0x408) == -1( -4 );
размер int (в данном случае) составляет 4 байта. и указатели, содержащие адрес int, будут иметь свой адрес, изменяющийся (+/-) с коэффициентом 4, поскольку в этом случае речь идет о int, 4 байта содержат одно целое число (1 единица)
w - a == (0x400 - 0x408) = -2( -8 )
если у тебя есть
a - w == (0x408 - 0x400) = 2( 8 )
person
ytobi
schedule
21.11.2016
b = a++
присваиваетa
b
, а затем увеличиваетa
(что не влияет наb
). - person Cairnarvon   schedule 21.11.2016printf("%d\n",b-a);
? Да ладно, остальное ты знаешь :) - person Sourav Ghosh   schedule 21.11.2016a
. - person Carl Norum   schedule 21.11.20160
. поправьте меня если я ошибаюсь. - person Haris   schedule 21.11.2016a
были инициализированы, операторb = a++
присваивает значениеa
b
, а затем увеличивает значениеa
. В этом случаеb - a
не0
. - person ad absurdum   schedule 21.11.2016a
был инициализирован в приведенном выше коде и игнорировал другое неопределенное поведение (хотя мне очень сложно это сделать), тоa - b
было бы1
, аb - a
было бы-1
. Хм, мой плохой. - person Haris   schedule 21.11.2016a
инициализирован, а спецификатор формата вprintf()
исправлен. Тогдаa
можно было бы безопасно присвоитьb
, и совершенно законно увеличитьa
на единицу, а также законно затем выполнить вычитаниеb - a
. - person ad absurdum   schedule 21.11.2016