LINUX.ORG.RU

В Си предложили добавить switch-case для строк

 , ,


0

3

Привет, чат!

Спустя много лет, в язык Си наконец предложено добавить возможность использовать выражение switch-case для строк. Например, можно будет писать вот такое:

const char *s = get_some_string();

switch(s) {
case "this":
  handle_this();
  break;
case "that":
  handle_that();
  break;
default:
  handle_other();
  break;
}

Таким образом, в Си будет чуть меньше способов отстрелить себе ноги.

Ссылка на предложение: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3895.pdf



Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от yorshka

Нравится длину на каждый чих пересчитывать?

Например?

Я что-то не припомню, чтобы это было какой-то проблемой. Не, я понимаю, что какой-нибудь идиот может написать что-то типа

char* str = "Hello world!";
func1( str, strlen(str) );
func2( str, strlen(str) );
func3( str, strlen(str) );

но это, вообще-то, не является недостатком ASCIIZ, а лишь демонстрирует интеллектуальный уровень идиота.

Большинство функций работы со строками один хрен что-то делают с каждым байтом стркои. И нулик в конце строки даже удобнее чем её длина в аргументах. Разницы особой нету между

int i;
for( i = 0; i < len; i++ ) делаем_что-то_с( str[i] );

и

char* s;
for( s = str; *s; s++ ) делаем_что-то_с( *s ); 

Так что смысла хранить длину вообще в большинстве случаев нету. А в тех случаях когда длина не помешала бы, функции обычно возвращают либо новую длину, либо количество добавленных байтов/символов. Тоже вычислять длину строки на каждыый чих не надо.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Я что-то не припомню, чтобы это было какой-то проблемой. Не, я понимаю, что какой-нибудь идиот может написать что-то типа

Зачем так сложно? Классическая ошибка сишника:

char *s = get_string();
for(size_t i = 0; i < strlen(s); i++) {
  ...
}

Встречается повсеместно. Но я даже не об этом, а о том, что все сишные функции из стандартной библиотеки, принимающие строку, считают длину внутри себя сами.

yorshka
() автор топика

Из того что я слышу - у этого пропозала крайне невысокие шансы быть принятым (чему лично я однозначно рад). Можно расходиться, я думаю.

bugfixer ★★★★★
()
Ответ на: комментарий от Stanson

Я что-то не припомню, чтобы это было какой-то проблемой

Есть один очень осуждающий факт: Кен Томпсон, работая над Plan 9, либо сам отказался от null-строк, либо не смог защитить их выбор перед командой. В итоге в Plan 9 используются length-based строки 1.

К сожалению, прямого мнения Денниса или Кена по данному вопросу я не нашёл (оно было бы намного ценнее лично для меня). Но мы можем посмотреть на вопрос сквозь характерный для них самих подход: «меньше слов, больше дела».

kaldeon ★★
()

Нормально. Чуть позже ждём match, как в Rust

fn main() {
    let my_string = "hello"; // Тип &str

    match my_string {
        "hello" => println!("Привет, мир!"),
        "goodbye" => println!("Прощай, мир!"),
        _ => println!("Что-то другое..."),
    }
}
Saakx
()
Ответ на: комментарий от ugoday

Хреново работает.

Для кого-то стакан наполовину полон, а для кого-то наполовину пуст.

Договариваешься на берегу «пишем под С89 или С23» и вперёд.

opensource не договаривается, они каждый пишут что хотят и используют чужой код. Договариваемся на бергу, пишем код без ошибок, вобще всё хорошо, в ноги не стреляем. А я начал про то, что не вижу в этом «чуть меньше способов отстрелить себе ноги», ИМХО, одно компенсируется другим.

NULL не является значением «мама».

А нулевой вектор, каким-то образом, коллинеарен любому вектору. В стандарте не указано, что NULL не является значением «мама». Там это как бы UB, при этом когда надо, компилятор разрешает обращаться по этом самому ((void *) 0), что особенно часто в embeded используется. И там, в принципе, по этом адресу может быть «мама», причём strcmp() сработает, а это switch case должен что, default сделать? А в нормальной системе NULL в strcmp() вызовет падение программы, но не средствами языка, а операционной системой.

Вы хотите именно ввести, что NULL != «мама», но при этом оставить подвешенным, вопрос: «NULL больше или меньше, чем „мама“?».

если строка содержит значение «мама» нужно вызывать foo(), иначе bar()

Прям готовая подковырка на собеседовании, юниор попытается написать:
if (strcmp()) foo() else bar();
а оказывается, нужно будет через
switch case break default
а потом ещё всегда можно докопать, что он поставил или не поставил break после default :)

mky ★★★★★
()
Ответ на: комментарий от VIT

Юзкейс «работать напрямую ручками с целевой платформой» реален, но для этой цели разве не будет более оптимальным выбор Forth, ввиду минимального рантайма (намного меньше Си) и прозрачного доступа к системе?

kaldeon ★★
()
Последнее исправление: kaldeon (всего исправлений: 2)

А сишники - опасные люди вообще. Знаете что я внезапное заметил? Везде жалобы на веб-макак, как их много, как они заполонили все. Но в основном темы по программированию мне приходится читать про си (иногда ассемблер) до той степени, что я даже начал понимать о чем в них пишут. Хочешь или нет, а знания откладывают, накладываются на опыт и внезапно ты понимаешь. А так как просто читать скучно, приходится иногда на нем писать.

А вот про популярныеы языки обычно тем нету, видимо потому что сложностей на них просто нет. Хочешь что то сделать - делай. Да и тех задач, чтом не приходится решать на других языках, никто не решает на популярных почему то - только на си.

Даже про раст везде пишут, везде его пиарят, везде хейтят, но кода на нем практического обычно нет на форуме. Если обсуждают код - это си. Бесит.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от kaldeon

Будет, и было дело, писал я и на Forth. Этот язык так и не создал вокруг себя экосистему. Комьюнити - да, но экосистема всё-таки создана вокруг Си.

VIT ★★
()
Ответ на: комментарий от VIT

Вот не надо про экосистемы вокруг си. Ее как раз просто нету. А комьюнити есть гигантское.

Никакой экосистемы у си быть принципиально не может, потому что нет хозяина и центра. Это свалка, раскиданная по планете. У каждого свое, каждый сам себе хозяин своих мини-экосистем.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от sergej

strncpy тут ни при чём, это не часть языка (так называемый «ISO C11» не является описанием языка Си в полном смысле, скорее это фантазии комитетчиков на эту тему). Лучше бы на мануал по строковым литералам послал, вот он как раз при чём.

firkax ★★★★★
()
Ответ на: комментарий от yorshka

Большинство строковых функций таки никакую длину внутри специально не считают. Она может получиться побочно в результате других их действий (связанных непосредственно с их работой и неизбежных в любом случае), но это бесплатно.

firkax ★★★★★
()
Ответ на: комментарий от ugoday

Ты специально понятия подменяешь или случайно вышло? То, что в кавычках - это содержимое строки. NULL же это не содержимое строки, это адрес (указатель). Каким боком ты указатель сравниваешь с символами? Чтобы узнать содержимое строки, указатель надо сначала разыменовать, и только потом его (содержимое) можно с чем-то сравнивать.

firkax ★★★★★
()
Ответ на: комментарий от LightDiver

Экосистемы бывают в экологии. ИТ тут ни при чём.

А Си - это не свалка, а общественное достояние, в отличие от пачки приватизированных языков.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Общественное достояние вполне может быть свалкой. Все разбросано везде и как попало - в этом и проблема и преимущество языка. А вот у других языков «экосистема» почему то имеется, хоть ее и не бывает.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

А вот про популярныеы языки обычно тем нету, видимо потому что сложностей на них просто нет

Просто программисты на популярных языках — это вайбкодеры. Они генерируют код с помощью LLM, и у неё же спрашивают, почему не собирается или не работает.

А сишники, если не нашли ответа в распечатанных стандартах C99 и POSIX, лежащих на тумбочке, спрашивают на форумах.

shdown ★★
()
Ответ на: комментарий от shdown

Ну не все же. Причем и там и там. А темы вечно о сишке.

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

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

Никакой экосистемы у языков нет. Ещё раз повторю - это не ИТ-понятие. В контексте ИТ его только неграмотные личности используют, в основном рекламщики.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Иногда ты душнейший зануда. В том понятии, в котором его используют про экологию, его и в экологии нет. Экология вообще лженаука для определенных коммерческих целей. Но общие признаки можно выдалить для разных сфер. И эти вот общие признаки есть и для ЯП.

Например, у процессора нет ножек - ножки есть только у котиков и вообще у живых существ. Но все мы понимаем, что и у процессоров они бывают.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Ну не все же. Причем и там и там.

Вы недооцениваете перекос в статистике.

Во-первых, дело в психологии/подходе людей (не столько даже возрасте), которые пишут на разных языках; во-вторых, на сишке LLM допускает гораздо больше ошибок в работе с памятью, чем опытные сишники, и результатом этого пользоваться довольно опасно.

Во-вторых, вы недооцениваете масштаб: stackoverflow загнулся, когда viable LLMs появились. Посмотрите статистику.

shdown ★★
()
Ответ на: комментарий от mky

В стандарте не указано, что NULL не является значением «мама».

Ну, на этом часть про логику можно и завершить. Она тут не ночевала.

Вы хотите именно ввести, что NULL != «мама», но при этом оставить подвешенным, вопрос: «NULL больше или меньше, чем „мама“?».

Да.

Прям готовая подковырка на собеседовании

Какая подковырка? Тут силлогизм с которым справится любой шестикласник.

ugoday ★★★★★
()
Ответ на: комментарий от shdown

В программировании есть такие темы, которые не решить при помощи ЛЛМ. Они усредняют подходы до стандартных, которые не всегда применимы. Иногда нужна нестандартщина для работы с информацией, например. А обсудить ее по сути не с кем.

Все, дошло. Да, я понял. Когда не было доступных ИИшек, мне приходилось эту нестандартщину обсуждать с парочкой знакомых профессионалов или вообще создавать темы тут - есть парочка по луа, например. Сейчас я перестал их создавать и вообще обсуждать. Даже для нестандартного проще подумать и обсудить с ЛЛМ. По сути то нужны знания, а знания они дают и вне стандартных подходов - главное потом вручную их применить.

Тогда остается вопрос - что не так с сишниками.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Какая экосистема? Где ffmpeg на модных язычках? Где curl на модных язычках? Почему actix линкуется с сишной zstd, а не переписанной на расте?

shdown ★★
()

суходрочка… Си забустит только введение (size,value) строк на уровне всей stdlib и окружения, с объявлением 0-terminated строк как deprecated.

zendrz ★★
()
Ответ на: комментарий от shdown

Я проходил интервью в WB и VK в этом году. Теперь спрашивают как устроен планировщик, сборщик мусора, хэш-таблицы и пр внутренности. Причём абстрактного ответа вроде «оно очищает недоступную память» или «оно решает коллизии бакетами» недостаточно, даже если ты объяснишь что это такое. Нужно объяснить какая именно сейчас в языке реализация и почему такая, а не другая.

На самом деле, это даже грустно. Это были интервью по языку Go. Роб Пайк гордился тем, что этот язык позволяет даже начинающим программистам писать хорошие программы. Вся суть в доступности. Рынок же отрицает эту реальность и заявляет: «не знаешь внутренности — не пиши код».

(Я лично не отрицаю пользу знаний о внутренностях, но я против интервью-фильтров по чеклисту. Сами-то небось ответы вчера прочли и не поняли 90% слов.)

LLM не сделает программистов тупыми, потому что у людей нет спроса на тупых профессионалов.

kaldeon ★★
()
Ответ на: комментарий от kaldeon

хэш-таблицы

Это были интервью по языку Go

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

Интересно, многие ли ответили. А вы бы как ответили?

shdown ★★
()
Ответ на: комментарий от LightDiver

Когда не было доступных ИИшек, мне приходилось эту нестандартщину обсуждать с парочкой знакомых профессионалов или вообще создавать темы тут - есть парочка по луа, например

Это вот эти:

Луа5.1 и параноидальная оптимизация

Перевод из n-ной системы счисления в 10-ную

Луа, регулярные выражения и переменные

Предсказуемость математики и луа (комментарий)

?

shdown ★★
()
Ответ на: комментарий от LightDiver

мне приходится читать про си

Приходится? Я поначалу удивился, что тут новый модератор, а после просмотра профиля неодумеваю. Вас Макском на цепи держит? Моргните.

ножки есть только у котиков и вообще у живых существ

«Нога», вроде как, от «ноготь», не такое уж древнее слово. Когда оно появилось, мебель уже должна была быть. Откуда уверенность, что только у живых существ? И, вроде как, не только в русском нога/ножка — одно слово и для мебели и для человека.

mky ★★★★★
()
Ответ на: комментарий от shdown

Я знаю только общий принцип хэш-таблиц (писал когда-то игрушечную реализацию) — это и объяснил.

Однако, ошибся, пытаясь угадать, что коллизии решаются сбалансированным деревом (на самом деле связанным списком). Удивился, узнав про эвакуацию. До сих пор не знаю какую проблему решают Шведские таблицы — про это тоже был вопрос.

Но это в прошлом. Теперь без подготовки не буду ходить на интервью.

kaldeon ★★
()
Последнее исправление: kaldeon (всего исправлений: 1)
Ответ на: комментарий от kaldeon

WB и VK в этом году. Теперь спрашивают как устроен планиров

А нахрена им конкретно внутренняя реализация планировщика? В чем смысл вопроса? Это про какой язык вообще?

Ааа, вижу. Ну да, странное. Просто мне интересно - а где и как могут пригодиться такие знания. Для какой задачи?

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от shdown

Про хэш-табицы. Ну вот мне пришлось столкнуться с их внутренностями на луа. Я теперь подробно знаю что там внутри, как, почему. Иногда бывает полезно это знать, потому что в реализациях выливается в нюансы работы и неоднозначность структуры данных. Это реально нужно знать.

А вот нахрена знать внутреннюю работу сборщика мусора - я хз.

LightDiver ★★★★★
()
Ответ на: комментарий от shdown

Они самые. Эти реализации, к слову, у меня до сих пор используются. Где то модифицированное, а где то так и осталось.

Сейчас я такой вопрос даже задавать не стану - просто поищу ответ у ИИшки, поизучаю варианты и все.

А вот сишники активно переписываются до сих пор. В итоге только эти темы интересные и остались на форуме.

LightDiver ★★★★★
()
Ответ на: комментарий от mky

Вас Макском на цепи держит? Моргните.

Это интерсное. Вообще самое интересное в программировании - работа с сырыми данными, с информацией, внутренняя работа в бэкэнде. Это же база, основа програмирования. А так как это есть только на сишке, да, именно приходится читать про сишку. Какие альтернативы? ;)

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Про хэш-табицы. Ну вот мне пришлось столкнуться с их внутренностями на луа. Я теперь подробно знаю что там внутри, как, почему

И что же внутри хэш-таблиц в луа, по-вашему? Что такое “Brent's variation”, которая упоминается в исходниках каждой версии Lua, начиная с 5.1?

shdown ★★
()
Ответ на: комментарий от shdown

Почему так происходит, по-твоему?

Потому что на все нужно время и желание. Старые реализации должны устареть, новые должны быть написаны. Не может солдат сожрать два мешка брюквы, понимаешь?

При этом не все вообще стоит переделывать, какие то старые реализации вполне можно использовать и дальше.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Потому что на все нужно время и желание.

У авторов actix нет времени на то, чтобы заиспользовать zstd, который уже переписали на расте?

Желание, думаю, должно иметься — непорядок, что такой проект и что-то сишное тащит.

Старые реализации должны устареть, новые должны быть написаны.

Новые написали. Где внедрение?

shdown ★★
()
Ответ на: комментарий от LightDiver

Они самые.

Сейчас я такой вопрос даже задавать не стану - просто поищу ответ у ИИшки, поизучаю варианты и все.

А, ну так у вас нестандартщина для детского сада. У других людей другая нестандартщина, которая, зачастую, улучшает state-of-the-art. LLM пока что такое не могут. Поэтому сишники не используют LLM.

shdown ★★
()
Ответ на: комментарий от shdown

Что такое “Brent’s variation”, которая упоминается в исходниках каждой версии Lua, начиная с 5.1?

Это разрешение коллизий с максимальной эффективностью. Я как раз с этим и сталкивался в свое время. Я тогда еще вручную массивами работал. Потом разбирался как экономить память. Пришлось изучать внутренности. Если коротко - лучше не экономить, дешевле выйдет в итоге.

Правда сначала я засрал память до невозможности пользоваться, а только после этого пришлось разбираться, писать свои структуры данных.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Это разрешение коллизий с максимальной эффективностью

Ну это как-то слишком общо. Конкретно идею сможете сформулировать? В результате одно предложение получается всего.

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Техническую причину я не знаю и не могу даже предположить.

Подозреваю, что есть инструкция сверху, чтобы создать предсказуемый фильтр джун/мидл/сеньор/лид, ибо я одни и те же вопросы вижу уже в трёх компаниях, как будто сговорились. Одна из них как раз специализируется подготовкой к интервью («ITK академия») и я выудил у них информацию, что это новый паттерн, примерно с 2025 года.

Работа с нагрузками? Не знаю, у меня не было такого опыта, где я бы регулярно выжимал метрики. Да и базы данных тут важнее как бы (про них тоже спрашивают всё самое сложное, но тут уже не придраться).

kaldeon ★★
()
Ответ на: комментарий от shdown

Ты недооцениваешь последствия. Представь - у тебя есть проект, который работает с определенной долей успешности. Ты можешь переписать все, потратив год и будет работать, ну на 30% успешнее. При этом ты ошибешься и добавишь каких то проблем, потратишь время, усилия. А оно тебе надо?

Я же говорю - на все новое нужно время в первую очередь. Об этом новом должны узнать, это новое должны пощупать, применить итд. Кто то этим занимается, кому то проще пытаться сформировать проект из старого нагромождения говна и палок.

LightDiver ★★★★★
()
Ответ на: комментарий от shdown

Это самое начало изучения программирования для меня было. Когда я не знал вообще ничего и пытался хоть что то сделать. А спросить было не у кого.

LightDiver ★★★★★
()
Ответ на: комментарий от shdown

Это способ разруливать коллизии так, чтобы поиск работал почти с идеальной скоростью. Это как я понимаю.

Если бы ключ лежал всегда строго в своей уникальной ячейке, коллизий бы не было. Пришел ключ, посчитали хэш, получили номер ячейки, хоп все. Взяли О(1). А у нас в ячейке может лежать чужой ключ! Вот это поворот, а?! Поэтому нельзя просто взять значение из ячейки, надо проверить - а это точно мой ключ? А не ошибаюсь ли я? Зачем вообще вот это все? Для чего мы живем? А не идиоты ли те, кто на мне пишет все эти программульки? (это уже со стороны ЯП)

И начинается глубинный поиск смыслов. Смотрим первую ячейку по хэшу. Не совпало? Смотрим следущую по правилам пробирования. Снова сравниваем. Итд, пока не найдем пустую ячейку.

Без вариации Брента цепочки коллизий могли быть линными, чтоы найти ключ, приходилось бы перебирать раз за разом. А с его вариацией цепочки укорачиваются искусственно. Алгоритм такой, что чаще всего ключ лежит в своей главной ячейке или в следущей за ней. Все. Скорость остается О(1), но это усредненное О(1) - за счет минимизации последвательных сравнений.

Ну круто же.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от kaldeon

Вот про паттерны верю. Я уже не раз сталкивался с заточкой учащихся под строгие паттерны поведения, тестирования. Где тебе буквально впихивают точные реализации того, что у тебя будут спрашивать. Это похоже на ЕГЭ, кстати, где тебя два года готовят что ты должен будешь отвечать и в каком формате.

LightDiver ★★★★★
()
Ответ на: комментарий от shdown

То есть ты считаешь, что сишники обсужают все это просто по той причине, что ЛЛМ неспособны выдать информацию об этом принципиально, а не просто потому что это старые деды, которые так привыкли и под страхом увольнения не полезут ими пользоваться?

LightDiver ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.