XaeroX писал: Она очень человеческая, но не математическая.
В данном случае я руководствуюсь логикой программиста.
У программиста в программе бывает два количества объектов: еденичный объект и сколько угодно объектов. Таким образом если что-то указано ОДИН РАЗ - значит это надо применить ко всему. Если больше одного, ну неважно сколько - значит имелось в виду что-то еще.
Помоему логично? Потому что в программировании есть волшебные константы 0 и 1. Любые другие числа, это уже хак.
Дядя Миша писал: я руководствуюсь логикой программиста
Впервые слышу о такой.
Цитата:
Дядя Миша писал: Таким образом если что-то указано ОДИН РАЗ - значит это надо применить ко всему. Если больше одного, ну неважно сколько - значит имелось в виду что-то еще.
Предположим, у нас есть строка s, заранее выделенная, размером 8 символов.
Тогда, по твоей логике, присвоение:
s = "ab";
даст нам строку "ab", а вот такое присвоение:
s = "a";
даст нам строку "aaaaaaaa", я правильно понял логику программиста?
XaeroX всё что я написал выше касается только инициализации массивов, очевидно же. Здесь неинтуитивный момент.
Причём ожидаемое поведение действительно бывает нужно.
Потому что повторюсь, мемсет тоже делает не то, что нужно.
Приходится в цикле присваивать. Т.е. оба способа последовательно фейлят.
Добавлено 22-05-2022 в 21:49:
Цитата:
XaeroX писал: Предположим, у нас есть строка s, заранее выделенная, размером 8 символов.
Ах да, совсем забыл. В моей VM строки - это не массивы
Это отдельный атомарный тип. Поэтому проблемы нет.
Дядя Миша писал: всё что я написал выше касается только инициализации массивов, очевидно же. Здесь неинтуитивный момент.
Как раз с житейской точки зрения - очень интуитивный.
Вот допустим, у тебя есть пять коробок, и тебе дали два яблока, положить их по коробкам. Что ты сделаешь? Положишь в две, а три будут пустыми ("инициализированными нулём"). А если у тебя всего одно яблоко - с какого же такого перепугу у тебя в каждой коробке появится по яблоку?
Цитата:
Дядя Миша писал: Причём ожидаемое поведение действительно бывает нужно.
Для этого в некоторых языках придумали функции типа fill.
Ну или в том же STL, ты можешь написать:
C++ Source Code:
std::vector<int> vec(5, 6);
что создаст тебе вектор из 5 элементов, каждый из которых равен 6.
Это логично, потому что ты сначала задаёшь размер вектора, а потом - чем его инициализировать. Но это неинтуитивно, потому что заменив скобки:
C++ Source Code:
std::vector<int> vec{5,6};
мы получим вектор из двух элементов 5 и 6.
Но это скорее проблема std::initializer_list из С++11, а не логики как таковой.
XaeroX неудачный пример. Ты приводишь в пример ресурсы, которые могут дать, а могут и не дать. В данном случае, у нас яблок сколько угодно, но нам лень их раскладывать по коробкам. Мы хотим чтобы все яблоки прыгнули в коробки, по примеру первого.
Дядя Миша писал: В данном случае, у нас яблок сколько угодно, но нам лень их раскладывать по коробкам. Мы хотим чтобы все яблоки прыгнули в коробки, по примеру первого.
Ок, но тогда и синтаксис должен как-то отличаться, хотя бы скобками, по примеру инициализации вектора. Иначе как мы отличим ситуацию ограниченных ресурсов от неограниченных?
Справедливо только для строк, потому что оно делает именно то, что нам надо - обнуляет первый символ. Даже если в остальные согласно какому-то стандарту запишется мусор, это будет уже неважно - главное что первый символ обнулён. Для строки, которая массив это критично важно.
А вот для остальных массивов - не очень, т.к. к ним в нагрузку обычно идёт счётчик использования, который увеличивают уже после того, как очередной элемент был проинициализирован. Т.е. мусор в массиве нас беспокоит меньше всего, за исключением строк, с которыми никто никакой счётчик не таскает, а наоборот - ориентируются по терминатору.
Т.е. твои примеры касательно строк правильные, но для меня неактуалны, т.к. в моем языке строка занимает четырёхбайтный идентификатор, а не массив.
Добавлено 22-05-2022 в 22:03:
Цитата:
XaeroX писал: Ок, но тогда и синтаксис должен как-то отличаться
Не. Достаточно просто того, что мы указали ОДИН РАЗ. Впрочем, можно вообще убрать нахрен все скобки. Думаю это будет самый оптимальный вариант. Инициализация без скобок вообще забьёт массив одним и тем же числом. Сохраняем совместимость и вводим новую особенность.
Добавлено 22-05-2022 в 22:04:
В крайнем случае можно вывести варнинг nonstandard extension used или что-то вродеэ того.
Дядя Миша писал: Даже если в остальные согласно какому-то стандарту запишется мусор, это будет уже неважно - главное что первый символ обнулён.
Нет такого стандарта, который поддерживает частичную инициализацию переменной. Нельзя быть немножко беременной и частично инициализированной. Сегодня мы инициализируем только один байт, а завтра что? Инициализируем только пару битов?
Поэтому всегда, если есть конструкция инициализации, переменная гарантированно будет инициализирована целиком. Данными, нулями, вызовом дефолт-конструктора - не суть важно, но мусора там точно не будет.
Добавлено 22-05-2022 в 15:11:
Цитата:
Дядя Миша писал: Впрочем, можно вообще убрать нахрен все скобки. Думаю это будет самый оптимальный вариант. Инициализация без скобок вообще забьёт массив одним и тем же числом. Сохраняем совместимость и вводим новую особенность.
Этот вариант звучит неплохо, кстати.
Тогда логика будет такая: есть скобки - инициализируем данными из списка инициализации, нет скобок - заполняем одним значением.
Расскажу вам как появился знаменитый баг компилятора MSVC 6.0, связанный с выпадением счётчика цикла за пределы видимости самого цикла.
Очень просто. Дело в том, что любая область внутри фигурных скобок считается как область подвидимости функции. Причём компилятор не различает к чему относятся эти скобки, для него это просто новая секция.
И такое поведение в принципе корректно для любых конструкций. Больше нигде никаких переменных не объявляется, ни в do ни во while, ни в switch ни в if. А чистый Си не дозволял объявлять в секции инициализации for новые переменные. Ну вот так этот баг только для одного for и приключился.
Невнимательность
Там надо было зайти в подобласть видимости уже после ключевого слова for.
Вот и вся хитрость.
Добавлено 28-05-2022 в 15:13:
Очередная чумовая проверка компиляторов на вшивость
C++ Source Code:
1
while( 0 )
2
{
3
int i;
4
}
В чём тут смысл:
1. условие константное
2. условие никогда не будет выполнено
Следовательно код в секции - мёртвый и его можно вообще скипнуть, не пытаясь распарсить. А как это проверить? Ну вот суём и смотрим - будет ли ругань на unreferenced local variable в разных режимах компиляции.
Если код был просто пропущен, то ессно ругани не будет.
Очередная чумовая проверка компиляторов от дяди Мишы.
Вставьте куда-нибудь вне любой функции неименованый блок скобок
C++ Source Code:
{
}
И посмотрите как будет ругаться компилятор. Вы возможно не задумывались, но это запрещённая конструкция по сути. Неименованный блок скобок возможен только внутри тела функции, как subscope.