Форум программистов, компьютерный форум CyberForum.ru

Почему работает и так, и так: arr[i] и i[arr]? - C++

Войти
Восстановить пароль
Регистрация
Другие темы раздела
C++ К какому типу грамматики относится грамматика C++? http://www.cyberforum.ru/cpp/thread574020.html
Доброго времени суток. Пишу курсовую на тему "Компиляторы". Была дана задача реализовать 2 парсера, которые будут проверять оформление сорцов на шарпе и плюсах. В качестве генератора использовал ANTLR, которые позволяет генерироать LL(k)-грамматики Шарп сделать получилось. Грамматику C++ я не смог формализовать с помощью LL(k)-грамматики. И тут у меня вопрос - к какому же всё таки типу...
C++ Считывание пикселей в игре Всем добрый день. Загорелся идеей сделать следущее: программу, которая в популярной игре CS 1.6 будет сканировать игровую область и при обнаружении в этой области моделек противника (или его головы) будет наводить прицел (мышь) на него. Т.е. идет непрерывное сканирование изображения игры. Подскажите как это можно реализовать, возможно уже имеются похожие готовые решения. Заранее спасибо! http://www.cyberforum.ru/cpp/thread565063.html
C++ Перемножения матриц с OpenMP дольше чем...
Здравствуйте! Написал 2 программы перемножения матриц, одну с использованием OpenMP, другую - просто. 2 матрицы 1000х1000 с использованием OpenMP высчитываются дольше. Процессор Intel Atom N570, поддержка OpenMP в проекте включена. Собственно, вопрос: почему дольше и что не так сделал? #include "stdafx.h" #include <iostream> #include <ctime> #include <clocale> #include <omp.h>
Посоветуйте книгу по разработке OLE DB и ODBC провайдеров. C++
Уважаемые коллеги. Не знаю в какой раздел написать. Думаю, что это ближе к C++. Посоветуйте что почитать по разработке OLE DB и ODBC провайдеров. Пока нашел на амазоне "OLE DB and ODBC Developer's Guide" Автор chuck wood. Книга 1999 года. Стоит много. Отзывов не нашел, так же как и электронной версии для "ознакомления". Сомневаюсь, стоит ли брать.
C++ C++ prog как cgi-скрипт, от чего иная инфа? http://www.cyberforum.ru/cpp/thread556141.html
Здравствуйте. Я новичок на форуме, не ругайте если что-то где-то не то разместил или не понятно рассказал. Описываю проблемы-вопрос 0) Использую Slackware 13.37 и встроенные методики 1) есть элементарнейший код: #include <iostream> using namespace std;
C++ Можно ли узнать размер одного элемента в STL контейнере? Допустим, мне захотелось узнать, сколько памяти ест мой map. Для этого надо знать размер 1 элемента. Я погуглил, покопался в cpp-reference, но ничего полезного не нашел. Сойдут и нестандартные способы, кроме изучения исходников компилятора. P.S. для примера std::map< int, int > map; В этом примере кроме pair< int, int >, который вешает 8 байт, теоретически должны храниться еще 3 указателя,... подробнее

Показать сообщение отдельно
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 18:38     Почему работает и так, и так: arr[i] и i[arr]?
Цитата Сообщение от Bers Посмотреть сообщение
Нет. Не так. Это - массив. Который компилятор имеет право не явно приводить к типу указателя
Нет. arr - это массив, реализуемый с помощью указателя. Именно так. О том, что это массив знают люди и sizeof, в остальных случаях это указатель. Мало того,
C++
1
2
3
int *p;
int i;
p[i] /* i-й элемент массива, на который указывает p, таким образом, указатель на массив и на его нулевой элемент - одно и тоже*/
.

Добавлено через 2 минуты
Например,
C++
1
2
3
4
int a[30];
    int *p;
    p=&a[4];
    p[3]=16;//16 присваивается седьмому элементу a
.

Добавлено через 39 минут
Цитата Сообщение от Evg Посмотреть сообщение
/* При вычислении адреса *используется формула a + i * sizeof (int)*/
a[i];
/* При вычислении адреса *используется та же формула a + i * sizeof (int),
** но не i + a * sizeof (int). Так что правило коммутативности тут не используется
** (т.к. выражения НЕ симметричны) */
Нет. То, что на низком уровне есть умножение, ничего не значит, формула здесь a+i безо всяких * sizeof (int). Да, само сложение перегружено на сложение не со слагаемым, а с его произведением на sizeof. Но это внутри оператора, а не в выражении. И некоммутативность здесь не причём, асимметрия суммы проистекает из разнотипности слагаемых: указатель и size_t. От их переставновки приходим просо к другой операции, которая перегружена прямо противоположным образом. Но если так и написать i+a, то выглядит это как обычная сумма чисел и от перестановки результат меняться не должен. Он и не меняется. Но скобки - это другой синтаксис и как сложение они не выглядят.

Добавлено через 3 минуты
В случае скобок это снижает читабельность, так как не говорит о том, где здесь индекс, а где указатель. Другое дело сумма с указателем, там адресная арифметика.

Добавлено через 1 минуту
И там не имеет значения где что.
 
Текущее время: 17:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru