Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос из теста 
V
    Опции темы
jimbo
Дата 23.4.2010, 12:12 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Привет всем. скажите, не компилируя код, ответ на вопрос:

Какое значение примет переменная result1 и result2 после выполнения следующиего фрагмента кода:

int array[10];
int * a = array;
int * b = &array[9];
int result1= b - a;



char array[10];
char* a = array;
char* b = &array[9];
int result2= b - a; 

Это сообщение отредактировал(а) jimbo - 23.4.2010, 13:08
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
triclosan
Дата 23.4.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



9

второй код не скомпилируется.

первый в принципе тоже.

PM MAIL   Вверх
SenkraD
Дата 23.4.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: нет
Всего: 23



jimbo, ну будут в обоих случаях ошибки компилятора -
    - (в первом) компилятор не будет знать что такое chararray[10]
    - (в втором) компилятор будет кричать что то типа can't assign value to rvalue: 2 = b - a;

Это сообщение отредактировал(а) SenkraD - 23.4.2010, 12:24


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
azesmcar
Дата 23.4.2010, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



jimbo
а чем отличаются первый и второй код?

Цитата(triclosan @  23.4.2010,  12:17 Найти цитируемый пост)
второй код не скомпилируется.

почему?

Добавлено через 36 секунд
Цитата(SenkraD @  23.4.2010,  12:24 Найти цитируемый пост)
jimbo, ну будут в обоих случаях ошибки компилятора -
    - (в первом) компилятор не будет знать что такое chararray[10]
    - (в втором) компилятор будет кричать что то типа can't assign value to rvalue: 2 = b - a;

а... smile в таком смысле, ну полагаю это опечатки.
PM   Вверх
jimbo
Дата 23.4.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



я проперся. виноват.

int array[10];
int *a = array;
int *b = &array[9];
int result1= b - a;



char array[10];
char* a = array;
char* b = &array[9];
int result2 = b - a;

Добавлено через 2 минуты и 38 секунд
Да ребят, опечатки. я просто вручную писал код. да еще и ошибся при копировании. все исправил и ответ дал только  один человек. что у остальных скомпилировать не получилось из за опечаток?smile)
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
borisbn
Дата 23.4.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



jimbo, исправленный код компилится нормально.
Ты пишешь второй код вместо первого или вместе с первым. если второе - тогда нормально, что не компилится


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
KOHCEPBATOP
Дата 23.4.2010, 14:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2010

Репутация: 1
Всего: 1



jimbo, для любых типов получится 9, т.к. результат приводится к размерности массива.
PM MAIL   Вверх
jimbo
Дата 23.4.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Ребят, вы вопрос читаете? я ж не спрашиваю ответ, я знаю как программировать. 

Вопрос заключался в том, что разница в адресах в 2-х примерах разная. это видно даже не компилируя! но результат одинаковый. т.е. вот если бы я решал эту задачу на бумаге - я бы сказал что в первом случае это будет 9*sizeof(int), во втором 9*sizeof(char). И я до сих пор уверен в этом. Только почему ответ всегда 9? Компилятор т.е. всегда показывает разницу не между адресами а между элементами массива. Т.е. когда происходит вычетание адресов, разница преобразуется с учетом размерности типа - почему? это же не явно! если бы я писал программу, я бы обязательно делил на размерность инта, чтобы получить индекс в массиве. допустим у нас быбыло:

int array[100];
int * ptr = &array[50];
int ptr2 = func(ptr);
int diff = ptr2-ptr;
int result = array[50+diff/sizeof(int)];

где func - функция каким-либо образом изменяющая адрес.допустим плюс 5 элементов.

а в итоге компилятор бы давал мне diff = 5. и result был бы не тем элементом что я хотел бы увидеть!


КОНСЕРВАТОР, объясни пожалуйста, почему результат автоматом приводится к размерности массива, в следствие чего это происходит?
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
GoldFinch
Дата 23.4.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



jimbo, 
Код

int* x = 0;
int* y = x + 1;

assert((char*)y == 4);
assert(y - x == 1);

PM MAIL ICQ   Вверх
mes
Дата 23.4.2010, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(jimbo @  23.4.2010,  14:41 Найти цитируемый пост)
Только почему ответ всегда 9? 


переведу Ваши задачи и вопрос по ним с "программного"  на "человеческий": 

Задача 1 :
Сколько арбузов в ряду арбузов между 3м и 10м ?
Задача 2:
Сколько апельсинов в ряду апельсинов между 3м и 10м ?

почему несмотря на то, что в одном случае арбузы, а в другом апельсины результат одинаков ?

smile


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 23.4.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Это адресная арифметика. Сделайте для int-а
(char*)&a[9]-(char*)a
и в разности получите свои волшебные байтики.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Sosed
Дата 23.4.2010, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.8.2009

Репутация: 1
Всего: 1



Цитата

Только почему ответ всегда 9? 

Результат операции с адресами - значение уже кратное типу(int, char).
PM MAIL   Вверх
jimbo
Дата 23.4.2010, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Цитата

Цитата

Только почему ответ всегда 9? 

Результат операции с адресами - значение уже кратное типу(int, char). 


Ок. я как бы понимаю что ответ всегда 9, и что разница между адресами уже приводится к типу. я не совсем понимал, для чего это сделано?

Теперь я понял. Попытаюсь объяснить. это делается автоматически, для удобства программирования видимо.

когда мы используем указатель таким образом:

char* ptr;
char massiv[20];
ptr = massiv[0];
while(*ptr!=0)
{
     ptr++; // т.е. в этом месте мы инкрементируем значение по указателю, в зависимости от типа попадаем на нужный адрес. Вот только тут я вижу надобность текущей адресной арифметики
}



--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
GoldFinch
Дата 23.4.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



jimbo, такая адресная арифметика сделана для массивов, т.к.
&a[1]
эквивалентно
a+1
PM MAIL ICQ   Вверх
jimbo
Дата 23.4.2010, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Да, я это уже понял. как бы сам и объяснил. просто никто до этого не заикнулся что сделано это из удобства, как и система little endian. PROFIT от такого использования адресов - очевиден, но математически он ни разу не очевиден. 

Это сообщение отредактировал(а) jimbo - 23.4.2010, 19:19
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.