Каково различие между статической переменной и переменной константы?

Может кто-то объяснять различие между a static и const переменная?

61
задан Meysam 20 January 2012 в 08:54
поделиться

9 ответов

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

Это, кстати, НЕ верно для объектных файлов. Каждый компоновщик, который я когда-либо использовал, предполагает, что вы хотите, чтобы использовали все указанные вами объекты, и пожалуетесь, если несколько объектов имеют один и тот же символ.

-121--4460227-

Насколько я знаю, нет пути сделать лучше, чем O (n) для обобщенного поиска по глобусу.

Однако для особых случаев поиска префиксов и суффиксов можно сделать отсортированные индексы для выполнения двоичного поиска, что приведет к O (log n) для поиска префиксов и суффиксов. Индекс префикса будет отсортирован на основе первого символа, затем второго и так далее. Индекс суффикса будет отсортирован на основе последнего символа, затем второго последнего и так далее (обратные последовательности).

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

Поскольку сравнение длины последовательности происходит быстрее, чем регрессы, я бы также предварительно фильтровал минимальную длину совпадающей последовательности или строку совпадения фиксированной длины для примера??? .doc.

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

-121--4028693-

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

Эти две концепции не являются взаимоисключающими и могут использоваться вместе.

41
ответ дан 24 November 2019 в 17:21
поделиться

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

Проверьте сайт .

-121--971470-

Статические переменные в контексте класса совместно используются всеми экземплярами класса.

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

Если переменная используется вне функции или класса, она гарантирует, что переменная может использоваться только кодом в этом конкретном файле, и нигде больше.

Однако постоянные переменные не могут изменяться. Обычное использование const и static вместе находится в рамках определения класса, чтобы обеспечить некоторый вид константы.

class myClass {
public:
     static const int TOTAL_NUMBER = 5;
     // some public stuff
private:
     // some stuff
};
-121--971469-

статическое означает локальное для модуля компиляции (т.е. один файл исходного кода C++), или, другими словами, означает, что оно не добавляется в глобальное пространство имен. в разных файлах исходного кода c++ может быть несколько статических переменных с одинаковым именем и без конфликтов имен.

const просто константа, значение не может быть изменено.

2
ответ дан 24 November 2019 в 17:21
поделиться

const означает константу, и их значения определяются во время компиляции, а не изменяются явно во время выполнения, значение константы не может быть изменено во время выполнения

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

Для получения дополнительной информации о статических переменных см. здесь

0
ответ дан 24 November 2019 в 17:21
поделиться

Краткий ответ:

A const - это обещание, что вы не будете пытаться изменить однажды установленное значение.

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

C99 заимствовал использование const из C ++. С другой стороны, static был источником многих споров (на обоих языках) из-за его часто сбивающей с толку семантики.

Кроме того, с C ++ 0x до C ++ 11 использование ключевого слова static не рекомендуется для объявления объектов в области пространства имен. Это устаревание было удалено в C ++ 11 по разным причинам (см. здесь ).

Более длинный ответ: больше о ключевых словах, чем вы хотели знать (прямо из стандартов):

C99

#include <fenv.h>
#pragma STDC FENV_ACCESS ON

/* file scope, static storage, internal linkage */
static int i1; // tentative definition, internal linkage
extern int i1; // tentative definition, internal linkage

int i2; // external linkage, automatic duration (effectively lifetime of program)

int *p = (int []){2, 4}; // unnamed array has static storage

/* effect on string literals */
char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable
char *p = (char []){"/tmp/fileXXXXXX"}; // static, modifiable
const char *cp = (const char []){"/tmp/fileXXXXXX"}  // static, non-modifiable


void f(int m)
{
    static int vla[ m ]; // err

    float w[] = { 0.0/0.0 }; // raises an exception

    /* block scope, static storage, no-linkage */
    static float x = 0.0/0.0; // does not raise an exception
    /* ... */
     /* effect on string literals */
    char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable
    char *p = (char []){"/tmp/fileXXXXXX"}; // automatic storage, modifiable
    const char *cp = (const char []){"/tmp/fileXXXXXX"}  // automatic storage, non-modifiable

}

inline void bar(void)
{
     const static int x = 42; // ok
     // Note: Since an inline definition is distinct from the 
     // corresponding external definition and from any other
     // corresponding inline definitions in other translation 
     // units, all corresponding objects with static storage
     // duration are also distinct in each of the definitions
     static int y = -42; // error, inline function definition
}

// the last declaration also specifies that the argument 
// corresponding to a in any call to f must be a non-null 
// pointer to the first of at least three arrays of 5 doubles
void f(double a[static 3][5]);

static void g(void); // internal linkage

C ++

В основном имеет ту же семантику, за исключением случаев, отмеченных в кратком ответе. Кроме того, отсутствуют параметры, определяющие static s.

extern "C" {
static void f4(); // the name of the function f4 has
                  // internal linkage (not C language
                  // linkage) and the function’s type
                  // has C language linkage.
}

class S {
   mutable static int i; // err
   mutable static int j; // err
   static int k; // ok, all instances share the same member
};

inline void bar(void)
{
     const static int x = 42; // ok
     static int y = -42; // ok
}

Есть еще несколько нюансов static C ++, которые я здесь опускаю. Взгляните на книгу или стандарт.

25
ответ дан 24 November 2019 в 17:21
поделиться

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

0
ответ дан 24 November 2019 в 17:21
поделиться

Статическая переменная может получить начальное значение только один раз. Это означает, что если в примере функции имеется код типа "static int a=0", и этот код выполняется при первом вызове этой функции, но не выполняется при последующем вызове функции; переменная (a) все равно будет иметь свое текущее значение (например, текущее значение 5), так как статическая переменная получает начальное значение только один раз.

Константная переменная имеет свою константу значения во всем коде. Например, если вы установите константную переменную как "const int a=5", то это значение для "a" будет постоянным во всей вашей программе.

2
ответ дан 24 November 2019 в 17:21
поделиться

Статические переменные в контексте класса совместно используются всеми экземплярами класса.

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

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

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

class myClass {
public:
     static const int TOTAL_NUMBER = 5;
     // some public stuff
private:
     // some stuff
};
3
ответ дан 24 November 2019 в 17:21
поделиться

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

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

в отличие от констант, значения статических переменных можно изменять во время выполнения.

2
ответ дан 24 November 2019 в 17:21
поделиться

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

Посетите этот сайт .

5
ответ дан 24 November 2019 в 17:21
поделиться