Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Въпрос за масиви в C/C++

Featured Replies

Здравейте,

имам един масив от цели числа

int a[] = {1, 2, 3, 4, 5, 6};

а израза

(1 + 3)[a] - a[0] + (a + 1)[2]

е равен на 8. По принцип i-тия елемент на масива е

a[i] или  *(a+i)

но не разбирам другите две конструкции. Може ли някой да обясни как се изчисляват те?

Благодаря предварително.

  • Автор

Изобщо не е лишено от смисъл.

a[0] == 1 -> това е очевидно

(a + 1)[2] е същото като a[3] == 4  -> малко аритметика с пойнтери (указатели)

(1+3)[a] би трябвало да е същото като a[1+3] == 5  -> това не го разбирам

std::cout << (1 + 3)[a] - a[0] + (a + 1)[2];  -> извежда 8 на конзолата

 

(1 + 3)[a] = a[4] = 5

a[0] = 1

(a + 1)[2] = a[3] = 4

 

5 - 1 + 4 = 8

преди 8 часа, mr mcwolf написа:

това е лишено от смисъл

не е лишено от смисъл. "а" се явява адреса на първия елемент от масива. Валидна е пойнтърната аритметика, при която безразмерните числа се прибавят към пойнтърите след като се умножат по размера на типа данни на масива.

Индексирането е еквивалентно на прибавяне на число към поинтър по законите на пойнтърната аритметика

  • Автор
преди 1 час, Реджеп Иведик написа:

Индексирането е еквивалентно на прибавяне на число към поинтър по законите на пойнтърната аритметика

Точно така. Затова (a + 1)[2] = a[3] = 4. Обаче не ми е много ясно защо (1 + 3)[a] = a[4]. Просто не съм виждал такъв синтаксис в C/C++. По тази логика (2)[a]  е същото като a[2] - и то наистина е едно и също нещо! Предполагам, че компилатора генерира еднакъв код в двата случая.

Предполагам, защото така е решил великия Ричи, да се слави името му. 

Логиката за по лесно запомняне е - махаш квадратните скоби и ги заместваш със знака "+", след което изчисляваш израза съгласно пойнтърната аритметика.

(1 + 3)[a] = (1 + 3) + a = 4 + a = a[4]

Където при преминаване от пойнтърна аритметика към аритметиката на Пеано се получава -> 4 * sizeof(int) + a

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.