Хотя на SO есть множество ссылок на эту тему, я думаю, что чего-то не хватает: ясное объяснение на простом языке о том, какие различия между неуказанным поведением (UsB), undefined поведение (UB) и поведение, определяемое реализацией (IDB), с подробным, но легким объяснением любого примера использования и примера.
Примечание: Я сделал сокращенное сокращение UsB ради компактности в этом WIKI, но не ожидаю, что он будет использоваться в другом месте.
Я знаю, что это может показаться дубликатом других сообщений (ближе к ним this), но , прежде чем кто-либо отметит это как дубликат, пожалуйста, рассмотрите, какие проблемы со всем материалом, который я уже нашел (и я собираюсь сделать сообщество WIKI из этого сообщения):
-
Слишком много разбросанных примеров. Разумеется, примеры неплохие, но иногда нельзя найти пример, который хорошо подходит для его проблемы, поэтому они могут ввести в заблуждение (особенно для новичков).
-
Примерами часто являются только коды с небольшими пояснениями. По таким деликатным вопросам, особенно для (относительных) новичков, может быть лучше подход сверху вниз: сначала ясное, простое объяснение с абстрактным (но не законным) описанием, затем несколько простых примеров с объяснениями, почему они вызывают некоторое поведение.
-
В некоторых сообщениях часто используется сочетание примеров на C и С++. C и С++ иногда не согласуются с тем, что они считают UsB, UB и IDB, поэтому пример может вводить в заблуждение для кого-то, кто не владеет знаниями на обоих языках.
-
Когда задается определение UsB, UB и IDB, обычно это простая ссылка на стандарты, которые иногда могут быть нечеткими или слишком сложными для переваривания для новичков.
-
Иногда цитирование стандартов является частичным. Многие должности приводят стандарт только для тех частей, которые полезны для этой проблемы, что хорошо, но не имеет общности. Более того, цитирование стандартов часто не сопровождается каким-либо объяснением (плохо для начинающих).
Поскольку я сам не супер-эксперт по этому вопросу, я создам сообщество WIKI, чтобы любой заинтересованный пользователь мог внести свой вклад и улучшить ответ.
Чтобы не испортить мою цель создания структурированного новичка WIKI, я бы хотел, чтобы плакаты следовали нескольким простым рекомендациям при редактировании WIKI:
-
Классифицируйте свой прецедент. Попробуйте поместить свой пример/код в уже существующую категорию, если это применимо, в противном случае создайте новый.
-
Сначала описать простые слова. Сначала опишите простые слова (без упрощения, конечно, качество сначала!) пример или точку, которую вы пытаетесь сделать. Затем введите образцы кода или цитаты.
-
Приведите стандарты по ссылке. Не публикуйте фрагменты различных стандартов, но дайте четкие ссылки (например, C99 WG14/N... раздел 1.4.7, абзац... ) и, если возможно, отправьте ссылку на соответствующий ресурс.
-
Предпочитайте бесплатные онлайн-ресурсы. Если вы хотите ссылаться на книги или не свободно доступные ресурсы, которые хорошо (и могут улучшить качество WIKI), но попытайтесь добавить также некоторые ссылки на свободные ресурсы. Это действительно важно, особенно для стандартов ИСО. Вы можете добавить ссылки на официальные стандарты, но попытайтесь добавить эквивалентную ссылку на свободно доступные черновики. И, пожалуйста, не заменяйте ссылки на черновики со ссылками на официальные стандарты, добавлять к ним. Даже некоторые отделы компьютерных наук в некоторых университетах не имеют копии стандартов (стандартов) ИСО, не говоря уже о большинстве программистов в целом!
-
Не отправляйте код, если это действительно необходимо. Почтовый код, только если объяснение с использованием только простого английского языка будет неудобным или непонятным. Попытайтесь ограничить образцы кода однострочными. Вместо этого отправляйте ссылки на другие SO Q & A.
-
Не публикуйте примеры на С++. Я бы хотел, чтобы это стало своего рода FAQ для C(Если кто-то хочет начать двухпоточность для С++, это было бы здорово, хотя). Соответствующие различия с С++ приветствуются, но только в качестве примечаний сторонних разработчиков. То есть после того, как вы подробно объясните C-пример, вы можете добавить пару утверждений о С++, если это поможет программисту C при переключении на С++, но я бы не хотел видеть примеры более чем, скажем, 20% -ного материала С++. Обычно простая заметка типа "(С++ ведет себя по-другому в этом случае)" плюс соответствующая ссылка должна быть достаточной.
Так как я довольно новичок в SO, я надеюсь, что не нарушу никакого правила, начав Q & A таким образом. Извините, если это так. Моды могут сообщить мне об этом.