Можно ли установить const с помощью пользовательского ввода? - PullRequest
4 голосов
/ 08 ноября 2011

При программировании на C, можно ли установить const со значением пользовательского ввода? Если да, то как?

Ответы [ 7 ]

8 голосов
/ 08 ноября 2011

Почему бы и нет?

void some_function(int user_input)
{
    const int const_user_input = user_input;
    ...
    return;
}

int main (void)
{
    int user_input;
    scanf("%d", &user_input);
    some_function(user_input);
    return 0;
}
6 голосов
/ 08 ноября 2011

вы можете иметь это даже более прямо, чем в ответе Дадама. (Обычно я бы написал просто в комментарии, но это проще сделать прямо в коде.)

int get_user_input(void)
{
    int user_input;
    scanf("%d", &user_input);
    return user_input;
}

int main(void)
{
    int const user_input = get_user_input();
    ...
    return 0;
}
1 голос
/ 04 июля 2018

да, вы можете.

#include <stdio.h>
int main()
{
   printf("enter your number : ");
   const int i = scanf("%d",&i)*i;
   printf("%d",i);
}

позвольте мне объяснить, как работает этот код. сначала вы должны знать, что функция scanf() возвращает значение integer, равное количеству элементов, прочитанных пользователем.

например:

1) scanf("%d",&a); этот оператор возвращает значение 1, поскольку он читает только один элемент.

2) scanf("%d %d",&a,&b); этот оператор возвращает значение 2, поскольку он читает два целых числа a и b.

аналогично, когда мы присваиваем scanf("%d",&i)*i i, это дает значение, умноженное на значение i (которое мы дали в качестве входных данных). следовательно, вы получаете то же значение i.

0 голосов
/ 08 ноября 2011

В дополнение к другим ответам (которые все говорят «нет»), вы можете сделать некоторые уродливые вещи, такие как

static const int notsoconst = 3;
scanf("%d", ((int*) &notsoconst));

Но это может скомпилироваться, но, вероятно, произойдет сбой во время выполнения (и это неопределенное поведение в спецификации языка C), поскольку notsoconst будет помещен в сегмент только для чтения (по крайней мере, с GCC в Linux).

Даже если это выполнимо, я нерекомендуем кодировать таким образом.И даже если ваша реализация не помещает константы в некоторый сегмент только для чтения, компилятору разрешается ожидать, что const никогда не изменится (как указано в стандарте языка), и ему разрешается оптимизировать с этим предположением.

0 голосов
/ 08 ноября 2011

Нет, const применяется во время компиляции. Вы должны принять свои собственные меры для принудительного применения const во время выполнения.

0 голосов
/ 08 ноября 2011

Переменная const - это C только для чтения.Так что нельзя установить его из пользовательского ввода

0 голосов
/ 08 ноября 2011

Линкер обычно размещает глобальный констант в пространстве только для чтения (например, в пространстве кода), и поэтому он не может быть изменен позже

См. Комментарии на местном const

...