Переменная в C с ограниченным диапазоном допустимых значений
Как я могу иметь переменную в C, значение которой должно находиться в диапазоне от 20 до 520? Я хочу ограничить присвоение этой переменной значениям от 20 до 520? В случае, если я возьму перечисление, значение которого должно начинаться с 20, мне все равно нужно определить еще 519 значений внутри перечисления.
4 ответа
Как я могу иметь переменную в C, значение которой должно находиться в диапазоне от 20 до 520?
В C. нет такого типа данных.
Даже если бы диапазон был чем-то близок к пределам некоторых типов, опасность потери значимости или переполнения все равно сохранялась бы (представьте, например, unsigned int , где вы хотите, чтобы нижняя граница была равна 0, но кто-то может превышение этой границы).
Однако вы можете написать свои собственные структуры, средства доступа и / или перечисления для достижения этой цели. Если вам интересно, прочитайте ответ Пола Р. Однако я не призываю вас к этому.
Я бы сделал это, если бы, например, переменная заполнялась пользователем:
Так что пользователю будут предлагаться снова и снова, пока его ввод не будет соответствовать критериям.
Как ограничить значение переменной?
Хочу реализовать в своей игре уровни предметов, но как сделать максимальный уровень? Например, что бы он был 30. Есть идея, при прокачке уровня если он будет равнятся 30, то просто пропадет кнопка, но как сделать это грамотно? Помню, как-то ограничивал значение поворота камеры, что бы нельзя было вертеть головой на 360 градусов вверх. Возможно, с помощью функции Math.Lerp, но я не помню) Подскажите.
Использовать не переменную, а свойство. А ограничение установить в операторе set
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
cpu — В C ++ лучше ограничить значение, используя std :: min или ветвь if?
Очень распространенный паттерн в программировании — ограничение максимального значения после некоторого обновления. Что я хотел бы знать, так это то, есть ли разница между следующими двумя частями кода и какой из них предпочтительнее:
Я думаю, что это сводится к тому, есть ли у процессоров инструкции для принятия двух значений и получения минимума. Если это так, вызов std :: min должен привести к этой инструкции и избежать ненужной ветви. Если нет, вторая версия избегает ненужного присваивания, когда значение <= значение Макс.
Я не очень хорош в таких вещах, но я уверен, что есть хакеры из старой школы, которые бы знали об этом. Им я спрашиваю: что лучше?
Решение
Современные компиляторы достаточно умны, чтобы генерировать один и тот же код в обоих случаях. Например, 32-битный GCC генерирует:
Другие решения
На VC10 на выпуске для следующего кода у нас есть следующая сборка:
Таким образом, оба случая оптимизированы либо cmovge или же cmovg инструкции.
Я бы все равно пошел с std::min потому что это показывает намерение лучше, чем if заявление. Это оптимизировано, и это более читабельно.
Ответ зависит от типа значения. Код может быть эффективно оптимизирован, если все операции полностью прозрачны для оптимизатора кода, что будет в случае, если значение является простым целым числом. Но ваш код также будет компилироваться, если значением является std :: string, и тогда вторая версия может быть потенциально более быстрой, поскольку присваивание является условным.
Переменная в C с ограниченным диапазоном значений
Как я могу иметь переменную в C, значение которой должно быть только от 20 до 520? Я хочу ограничить это присвоение переменной значениями от 20 до 520?
В случае, если я беру перечисление, значение которого должно начинаться с 20, мне все равно нужно определить еще 519 значений внутри enum.
C не имеет возможности напрямую выразить то, что вы хотите. Обратите внимание, что даже enum не выполняет принудительное выполнение допустимых значений. Вы можете назначить любое значение базового типа enum .
Вы всегда можете придумать свою собственную логику, например. если это часть объекта, который вы моделируете как struct:
К сожалению, C не обеспечивает контроль доступа для членов структуры. Так неудачно сначала.
Вы должны (попытаться?) обойти это ограничение любым подходящим способом. Можно скрыть данные от пользователя:
Это связано с еще одним недостатком, так как другие функции, такие как sizeof , также становятся непригодными. Мы, вероятно, должны предоставить по крайней мере функцию size_t sizeofTheType() , позволяющую пользователю выделять соответствующий объем памяти и возможно, и другие вещи.
Как я могу получить переменную в C, значение которой должно лежать только от 20 до 520?
В C не существует такого типа данных.
Даже если диапазон был чем-то близким к границам некоторых типов, опасность переполнения или переполнения была бы все равно (представьте себе unsigned int , например, где вы хотите, чтобы нижняя граница была 0, но кто-то может превысить эту привязку).
Что вы можете сделать, это написать свои собственные структуры, аксессоры и/или перечисления для достижения этого. Если вы заинтересованы, прочитайте Пол Р ответ. Однако я не призываю вас сделать это.
Я бы сделал это, если, например, переменная должна была быть заполнена пользователем:
чтобы пользователь запрашивал снова и снова, пока его вход не соответствует критериям.