реклама на сайте
подробности

 
 
6 страниц V  « < 2 3 4 5 6 >  
Closed TopicStart new topic
> А почему так инициализация
Forger
сообщение Jul 26 2018, 14:22
Сообщение #46


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 26 2018, 17:20) *
"С какой стороны будет "обрезана" слишком длинная литеральная константа" - ни с какой, даст ошибку компиляции

В том-то и дело, что с литеральной константой компилятор дает лишь предупреждение (об этом выше уже шла речь).
Это как в int попытаться засунуть слишком длинный hex: int v = 0x123456780912345; - ошибки не будет, но будет соотв. предупреждение
В случае с hex все вполне однозначно - компилятор разместит его именно так, как нужно и читать его будет тоже так, как нужно (в зависимости от BE/LE).
С многобайтными литералами получается, что не все так однозначно и это зависит от BE/LE, о чем уже поделился XVR.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 26 2018, 15:25
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



С литеральными все понятно и вопроса не было бы. Я про мультибайтную, сорри, попутал. Просто вообще ранее с таким не сталкивался
Блин, Вы меня запутали. Вот "например, '12345678' для 4-байтового int) " просто не скомпилируется, я о том
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 26 2018, 15:35
Сообщение #48


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 26 2018, 18:25) *
Вот "например, '12345678' для 4-байтового int) " просто не скомпилируется, я о том

В том-то и дело, что все компилируется, но с warning sm.gif
Без warning будет, если число символов строго совпадает с sizeof() соотв. переменной, куда присваиваем.

У меня лично вопрос остался один: какая часть этой слишком длинной литеральной строки будет обрезана в зависимости от BE/LE - правая или левая?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 26 2018, 16:04
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Ну Майкрософт ошибку дает, видимо кто на что горазд. Я С изучал раз 5, как и ++, после чего забывал все без практики. И каждый раз мир открытий чудных. Причем если С еще придраться не особо, то ++ с последними нововведениями скатился в откровенное черти что.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 26 2018, 16:18
Сообщение #50


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 26 2018, 19:04) *
то ++ с последними нововведениями скатился в откровенное черти что.

Раз пошла такая пьянка, то договаривайте ))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 26 2018, 16:43
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 26 2018, 19:18) *
Раз пошла такая пьянка, то договаривайте ))

да нечитаемо все стало, и реально слишком сложно для изучения. К тому же сегодня словил странный глюк в МS на range based loop, как дома проверю - напишу.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 26 2018, 17:12
Сообщение #52


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 26 2018, 19:43) *
да нечитаемо все стало, и реально слишком сложно для изучения.

Странно ... wacko.gif По мне как раз все наоборот - более свежие стандарты плюсов позволяют наоборот - сделать код проще, меньше текста, лучше читаемость и лучше оптимизация компилятора.
Может M$ идет каким-то своим путем? ..


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 26 2018, 19:40
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Forger @ Jul 26 2018, 18:35) *
У меня лично вопрос остался один: какая часть этой слишком длинной литеральной строки будет обрезана в зависимости от BE/LE - правая или левая?
Старшая. Сначала литеральная константа преобразуется в int (с учетом BE/LE), затем этот int будет усечён (если понадобится) по обычному правилу приведения типов.

Стандарт на этот счет весьма неопределен - implementation dependent
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 27 2018, 04:57
Сообщение #54


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 26 2018, 19:18) *
Раз пошла такая пьянка, то договаривайте ))

вот что тут https://msdn.microsoft.com/ru-ru/library/zzw4bwhd.aspx Микрософт имел в виду в
Код
vector <int> v5(5);
    for (auto i : v5) {
        v5[i] = i;
    }

и пишут, что v5 = 0 1 2 3 4 . А он нулевой будет в итоге, i это значения ветора по копии, а никак не индекс
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 27 2018, 05:25
Сообщение #55


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



По логике i тут должен быть int, для этого тут поставлен auto.
Такая конструкция должна правильно работать уже с C++11. Или я что-то не понимаю?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 27 2018, 05:42
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 27 2018, 08:25) *
По логике i тут должен быть int, для этого тут поставлен auto.
Такая конструкция должна правильно работать уже с C++11. Или я что-то не понимаю?

v5[i] = i; - это фигня полная. Выражение for (auto i : v5) пробежит по всему вектору, присваивая i последовательные значения из этого вектора. Это не индекс. Так как вектор создан нулевым, то это будет так :
v5[0] = 0;
v5[0] = 0;
v5[0] = 0;
v5[0] = 0;
v5[0] = 0;
5 раз
Если сделать
Код
    vector <int> v5(5, 10);
    for (auto i : v5) {
        v5[i] = i;
    }

то будет access violation
ибо это v5[10] = 10; 5 раз подряд
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 27 2018, 06:26
Сообщение #57


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(DASM @ Jul 27 2018, 09:42) *
то будет access violation

Именно из-за вот таких приколов и сложностей в понимании лично я не взлюбил C++. Хотя и достаточно вумных книжек прочитал по нему... Со временем понял, что выражение "Веревка достаточной длины, чтобы выстрелить себе в ногу(с)" имеет смысл. Был у нас один сотрудник, который всегда писал программы с применением, возможно, всех фишек C++. В итоге я ничего не понял из листинга (совсем!) даже относительно несложного проекта, а при попытке объяснить код сам программист пришел в замешательство со словами "ну, так делают другие программисты и оно так проще для понимания и удобнее". Жесть. И вот лично я люблю Си, чистый Си. И, возможно, не прочь выучить C++ нормально - но куда угнаться-то? Постоянно что-то новое. Считаю, что язык должен быть строгим в своем синтаксисе и однозначно трактуемым. Бомбануло у меня, помню, тогда, когда нашел штук пять разных способов инициализации членов класса при объявлении объекта... Брр, даже не стану вспоминать. Можете ругать biggrin.gif
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 27 2018, 06:44
Сообщение #58


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 27 2018, 08:42) *
Это не индекс.

По-ходу i - это в данном случае итератор ...

Попытался эти примеры прокомпилить в старом добром keil (компилятор v6).
Примеры собирает, но отлаживать их вообще неудобно: вроде i по окну watch - int, а нифига - это действительно итератор. Пример и правда не работает, как ожидается ((



Честно говоря, не использовал так активно штатные шаблоны (в частности std::vector). До умного for() так и не добрался.
Выяснил, что они могут неявно использовать кучу.
А кучу не использую, в известных целях (речь про обычные МК).

В свое время как-то делал самописный iterator, for_each, умный указатель ... минимально необходимые. Недавно добрался до чудесной штуки - делегаты...
В основном - в академических целях, но потом "проникся" )) Тогда использовал "старые" плюсы.
Но в новых стандартах плюсов они уже есть и готовые (кроме делегатов), но, в очередной раз прихожу к выводу, что они адски "толстые", по крайней мере в применении к обычным МК.

Мне лично из C++11 (для меня нового) пришлись по душе жесткие ограничения при неявном приведении типов - нужно ставить явный static_cast или переписывать код.
Также пригодилась инициализация полей классов прямо в описании класса (например, какие-нить константы), т. е. максимально возможный уход от #define.
const_expr - вообще чудесная штука. Также считаю полезными final и override.... Это пока то, что вспомнил с ходу.

Вполне возможно, что негатив к C++ и его новым фишкам возникает в очень толстых проектах, где работает куча народу и каждый пытается показать другим, что он умеет.
Полагаю, что если жестко ограничить применение тех или иных конструкций и выработав соотв. "правила", то негатива будет меньше wink.gif



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 27 2018, 07:29
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



i это не итератор, это локальная переменная типа элемента вектора. Сравните
Код
    struct fio
    {
        string f;
        string i;
    };
    vector <fio> names {{ "ivan", "ivanov" }, {"petr", "petrov"}};
    for (auto &r : names)    
        r.i = "sidorov";
    for (auto r : names)
        cout << r.f << " " <<  r.i << endl;
Go to the top of the page
 
+Quote Post
Herz
сообщение Jul 27 2018, 07:37
Сообщение #60


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Господа, пора бы остановиться, а? Очень не хочется превращения темы в очередной холивар.
Понятно, что у любых языков, стандартов и компиляторов полно недостатков. Тем более понятно, что умельцы всегда могут наворотить чудес в коде...
Обсуждать всякие причуды, валя всё в кучу, смысла нет, ИМХО.
Цитата(Arlleex @ Jul 27 2018, 09:26) *
Можете ругать biggrin.gif

Нет, давайте не будем. У всех свои предпочтения, но провоцировать свару не надо. Это предупреждение.
Go to the top of the page
 
+Quote Post

6 страниц V  « < 2 3 4 5 6 >
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th July 2025 - 03:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016