Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2017, 14:52   #21
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от tutejshy Посмотреть сообщение
1) 2) Тоесть запись a[1] более читабельная чем *(a + 1)?
На мой взгляд, безусловно. Не хотел бы я сопровождать Ваш "диабетический" код..
Black Fregat вне форума Ответить с цитированием
Старый 30.07.2017, 15:10   #22
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Не хотел бы я сопровождать Ваш "диабетический" код..
Забавно) ведь диабет вызывает сахар - ваш каламбур не получился: уместнее было бы сказать это именно при использовании синтаксического сахара, а не наоборот)
tutejshy вне форума Ответить с цитированием
Старый 30.07.2017, 16:14   #23
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Ладно люди загоняются, что классы, исключения и прочие плюшки С++ - это оверхэд, но тут то зачем? Компилятор сам все a[i] приведёт примерно к тому, что сейчас пишете вручную. Смысл всего этого мероприятия?
pu4koff вне форума Ответить с цитированием
Старый 30.07.2017, 16:30   #24
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от tutejshy Посмотреть сообщение
и почему?
Нужно за большим количеством деталей следить.
Цитата:
Сообщение от tutejshy Посмотреть сообщение
я бы так не сказал
Посмотрим через пару лет.


Просто так:
Код:
#include <iostream>


int (&f1())[2]
{
    static int a[2] = {10, 40};
    //...
    return a;
}

int (&f2())[2]
{
    static int a[2] = {30, 50};
    //...
    return a;
}



int (&(*(&get_f())[2])())[2]
{
    static int (&(*a[2])())[2] = {f1, f2};
    //...
    return a;
}



int main()
{
    std::cout << get_f()[1]()[1] << std::endl;
    std::cout << *((*(get_f() + 1))() + 1) << std::endl;
}
http://rextester.com/XEM50706
И первое особо не понятно, а второе вообще - сплошная скобка.
Croessmah вне форума Ответить с цитированием
Старый 30.07.2017, 16:37   #25
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
а что они говорят?
ничего интересного.

смысли, просто раскрывают новобранцам суть:
Цитата:
Еще более удивительным, по крайней мере на первый взг-
ляд, кажется тот факт, что ссылку на A[I] можно записать в
виде *(A+I). При анализировании выражения A[I] в языке "C"
оно немедленно преобразуется к виду *(A+I); эти две формы
совершенно эквивалентны. Если применить операцию & к обеим
частям такого соотношения эквивалентности, то мы получим,
что &A[I] и A+I тоже идентичны: A+I - адрес I-го элемента от
начала A. С другой стороны, если PA является указателем, то
в выражениях его можно использовать с индексом: PA[I] иден-
тично *(PA+I). Короче, любое выражение, включающее массивы и
индексы, может быть записано через указатели и смещения и
наоборот, причем даже в одном и том же утверждении.
(ц)Керниган, Ричи. Язык C
никаких волшебных рекомендаций делать сложно там,
где можно сделать просто,
в книжке нет.
_Bers вне форума Ответить с цитированием
Старый 30.07.2017, 16:52   #26
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию

а еще
Цитата:
В Си существует связь между указателями и массивами, и связь эта настолько тесная, что эти средства лучше
рассматривать вместе. Любой доступ к элементу массива, осуществляемый операцией индексирования,
может быть выполнен с помощью указателя. Вариант с указателями в общем случае работает быстрее, но
разобраться в нем, особенно непосвященному, довольно трудно.
tutejshy вне форума Ответить с цитированием
Старый 30.07.2017, 17:02   #27
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от tutejshy Посмотреть сообщение
Вариант с указателями в общем случае работает быстрее
Это не про *(arr + index)
Croessmah вне форума Ответить с цитированием
Старый 30.07.2017, 17:06   #28
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
сломается.
тип int, указанный в вашем шаблоне - знаковый.
1.
он полагает легальным использование отрицательных величин.



то, чего быть не должно, не должно быть в принципе.

2.
диапазон допустимых положительных значений
получается в два раза меньше
против реального диапазона std::array,

прототип которого выглядит:
template < class T, size_t N > class array;
http://www.cplusplus.com/reference/array/array/

3.
почему вообще вы использовали знаковый тип данных
для обозначения величины,
которая в принципе не может быть отрицательной?
где здравый смысл?
Потому что я не вим мастер, и пишу на форуме . В иде я бы конечно прочел варнинги компилера и / или статик анализера и исправил - не велика беда. Согласен, нада size_t

Кстати, вы пробовали в qt проекте использовать std ? - ад адов, у кт все размеры int - я задолбался приводить типы там (на вопрос зачем - скажу, логику всегда стараюсь делать на std, qt только для гуя/доступа к ос - так максимально переносимо, например, отковыриваем гуй и делаем сервер).

Последний раз редактировалось alexzk; 30.07.2017 в 17:12.
alexzk вне форума Ответить с цитированием
Старый 30.07.2017, 17:12   #29
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
почему вообще вы использовали знаковый тип данных
для обозначения величины,
которая в принципе не может быть отрицательной?
C++ Core Guidlines говорит так:
Цитата:
ES.100: Don’t mix signed and unsigned arithmetic
ES.101: Use unsigned types for bit manipulation
ES.102: Use signed types for arithmetic
ES.103: Don’t overflow
ES.104: Don’t underflow
ES.105: Don’t divide by zero
ES.106: Don’t try to avoid negative values by using unsigned
ES.107: Don’t use unsigned for subscripts
...
ES.107: Don’t use unsigned for subscripts
Reason To avoid signed/unsigned confusion. To enable better optimization. To enable better error detection.
Код:
//Example, bad
vector<int> vec {1, 2, 3, 4, 5};

for (int i = 0; i < vec.size(); i += 2)                    // mix int and unsigned
    cout << vec[i] << '\n';
for (unsigned i = 0; i < vec.size(); i += 2)               // risk wraparound
    cout << vec[i] << '\n';
for (vector<int>::size_type i = 0; i < vec.size(); i += 2) // verbose
    cout << vec[i] << '\n';
for (auto i = 0; i < vec.size(); i += 2)                   // mix int and unsigned
    cout << vec[i] << '\n';
Note The built-in array uses signed subscripts. The standard-library containers use unsigned subscripts. Thus, no perfect and fully compatible solution is possible. Given the known problems with unsigned and signed/unsigned mixtures, better stick to (signed) integers.
Код:
//Example
template<typename T>
struct My_container {
public:
    // ...
    T& operator[](int i);    // not unsigned
    // ...
};
Example
??? demonstrate improved code generation and potential for error detection ???
Alternatives Alternatives for users
use algorithms
use range-for
use iterators/pointers
Enforcement
Very tricky as long as the standard-library containers get it wrong.
Croessmah вне форума Ответить с цитированием
Старый 30.07.2017, 17:17   #30
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от tutejshy Посмотреть сообщение
Вариант с указателями в общем случае работает быстрее, но
разобраться в нем, особенно непосвященному, довольно трудно.
доступ по индексу идентичен доступу по указателю.

это гарантируем стандарт языка:
8.3.4 Arrays [dcl.array]

Цитата:
the subscript operator [] is interpreted in such
a way that E1[E2] is identical to *((E1)+(E2))
другими словами,
компилятор делает ровно тоже самое,
что и вы.

разницы нет никакой.
кроме той, что в вашем случае код хуже читается.

Последний раз редактировалось _Bers; 30.07.2017 в 17:23.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Язык Си - массивы leonid_spartak Помощь студентам 1 12.05.2017 09:30
Массивы.Язык Си Caca0 Помощь студентам 26 05.02.2013 00:10
массивы. язык СИ. skauzer_blr Помощь студентам 8 10.04.2012 22:15
Массивы, язык - C. xcyber Помощь студентам 9 19.10.2009 21:38
Массивы (язык С++) Ноберт Помощь студентам 3 24.08.2009 23:10