Constant (computer programming)

In computer programming, a constant is a value that is not altered by the program during normal execution. When associated with an identifier, a constant is said to be "named," although the terms "constant" and "named constant" are often used interchangeably. This is contrasted with a variable, which is an identifier with a value that can be changed during normal execution. To simplify, constants' values remains, while the values of variables varies, hence both their names.

Constants are useful for both programmers and compilers: for programmers, they are a form of self-documenting code and allow reasoning about correctness, while for compilers, they allow compile-time and run-time checks that verify that constancy assumptions are not violated,[a] and allow or simplify some compiler optimizations.

There are various specific realizations of the general notion of a constant, with subtle distinctions that are often overlooked. The most significant are: compile-time (statically valued) constants, run-time (dynamically valued) constants, immutable objects, and constant types (const).

Typical examples of compile-time constants include mathematical constants, values from standards (here maximum transmission unit), or internal configuration values (here characters per line), such as these C examples:

const float PI = 3.1415927;  // maximal single float precision
const unsigned int MTU = 1500;  // Ethernet v2, RFC 894
const unsigned int COLUMNS = 80;

Typical examples of run-time constants are values calculated based on inputs to a function, such as this C++ example:

void f(std::string s) {
  const size_t l = s.length();
  // ...
}

Use

Some programming languages make an explicit syntactic distinction between constant and variable symbols, for example considering assignment to a constant to be a syntax error, while in other languages they are considered syntactically the same (both simply an identifier), and the difference in treatment is semantic (assignment to an identifier is syntactically valid, but if the identifier is a constant it is semantically invalid).

A constant value is defined once and can be referenced many times throughout a program. Using a constant instead of specifying the same value multiple times can simplify code maintenance (as in don't repeat yourself) and can be self documenting by supplying a meaningful name for a value, for instance, PI instead of 3.1415926.

Comparison with literals and macros

There are several main ways to express a data value that doesn't change during program execution that are consistent across a wide variety of programming languages. One very basic way is by simply writing a literal number, character, or string into the program code, which is straightforward in C, C++, and similar languages.

In assembly language, literal numbers and characters are done using the "immediate mode" instructions available on most microprocessors. The name "immediate" comes from the values being available immediately from the instruction stream, as opposed to loading them indirectly by looking up a memory address.[1] On the other hand, values longer than the microprocessor's word length, such as strings and arrays, are handled indirectly and assemblers generally provide a "data" pseudo-op to embed such data tables in a program.

Another way is by defining a symbolic macro. Many high-level programming languages, and many assemblers, offer a macro facility where the programmer can define, generally at the beginning of a source file or in a separate definition file, names for different values. A preprocessor then replaces these names with the appropriate values before compiling, resulting in something functionally identical to using literals, with the speed advantages of immediate mode. Because it can be difficult to maintain code where all values are written literally, if a value is used in any repetitive or non-obvious way, it is often named by a macro.

A third way is by declaring and defining a variable as being "constant". A global variable or static variable can be declared (or a symbol defined in assembly) with a keyword qualifier such as const, constant, or final, meaning that its value will be set at compile time and should not be changeable at runtime. Compilers generally put static constants in the text section of an object file along with the code itself, as opposed to the data section where non-const initialized data is kept. Some compilers can produce a section specifically dedicated to constants. Memory protection can be applied to this area to prevent overwriting of such constants by errant pointers.

These constants differ from literals in a number of ways. Compilers generally place a constant in a single memory location identified by symbol, rather than spread throughout the executable as with a macro. While this precludes the speed advantages of immediate mode, there are advantages in memory efficiency, and debuggers can work with these constants at runtime. Also while macros may be redefined accidentally by conflicting header files in C and C++, conflicting constants are detected at compile time.

Depending upon the language, constants can be untyped or typed. In C and C++, macros provide the former, while const provides the latter:

#define PI 3.1415926535

const float pi2 = 3.1415926535;

while in Ada, there are universal numeric types that can be used, if desired:

pi : constant := 3.1415926535;

pi2 : constant float := 3.1415926535;

with the untyped variant being implicitly converted to the appropriate type upon each use.[2]

Dynamically-valued constants

Besides the static constants described above, many procedural languages such as Ada and C++ extend the concept of constantness toward global variables that are created at initialization time, local variables that are automatically created at runtime on the stack or in registers, to dynamically allocated memory that is accessed by pointer, and to parameter lists in function headers.

Dynamically valued constants do not designate a variable as residing in a specific region of memory, nor are the values set at compile time. In C++ code such as

float func(const float ANYTHING) {
    const float XYZ = someGlobalVariable*someOtherFunction(ANYTHING);
    ...
}

the expression that the constant is initialized to are not themselves constant. Use of constantness is not necessary here for program legality or semantic correctness, but has three advantages:

  1. It is clear to the reader that the object will not be modified further, once set
  2. Attempts to change the value of the object (by later programmers who do not fully understand the program logic) will be rejected by the compiler
  3. The compiler may be able to perform code optimizations knowing that the value of the object will not change once created.[3]

Dynamically valued constants originated as a language feature with ALGOL 68.[3] Studies of Ada and C++ code have shown that dynamically valued constants are used infrequently, typically for 1% or less of objects, when they could be used much more, as some 40–50% of local, non-class objects are actually invariant once created.[3][4] On the other hand, such "immutable variables" tend to be the default in functional languages since they favour programming styles with no side-effect (e.g., recursion) or make most declarations immutable by default, such as ML. Purely functional languages even forbid side-effects entirely.

Constantness is often used in function declarations, as a promise that when an object is passed by reference, the called function will not change it. Depending on the syntax, either a pointer or the object being pointed to may be constant, however normally the latter is desired. Especially in C++ and C, the discipline of ensuring that the proper data structures are constant throughout the program is called const-correctness.

Constant function parameters

In C/C++, it is possible to declare the parameter of a function or method as constant. This is a guarantee that this parameter cannot be inadvertently modified after its initialization by the caller. If the parameter is a pre-defined (built-in) type, it is called by value and cannot be modified. If it is a user-defined type, the variable is the pointer address, which cannot be modified either. However, the content of the object can be modified without limits. Declaring parameters as constants may be a way to signalise that this value should not be changed, but the programmer must keep in mind that checks about modification of an object cannot be done by the compiler.

Besides this feature, it is in C++ also possible to declare a function or method as const. This prevents such functions or methods from modifying anything but local variables.

In C#, the keyword const exists, but does not have the same effect for function parameters, as it is the case in C/C++. There is, however, a way to "stir" the compiler to do make the check, albeit it is a bit tricky.[5]

Object-oriented constants

A constant data structure or object is referred to as "immutable" in object-oriented parlance. An object being immutable confers some advantages in program design. For instance, it may be "copied" simply by copying its pointer or reference, avoiding a time-consuming copy operation and conserving memory.

Object-oriented languages such as C++ extend constantness even further. Individual members of a struct or class may be made const even if the class is not. Conversely, the mutable keyword allows a class member to be changed even if an object was instantiated as const.

Even functions can be const in C++. The meaning here is that only a const function may be called for an object instantiated as const; a const function doesn't change any non-mutable data.

C# has both a const and a readonly qualifier; its const is only for compile-time constants, while readonly can be used in constructors and other runtime applications.

Java

Java has a qualifier called final that prevents changing a reference and makes sure it will never point to a different object. This does not prevent changes to the referred object itself. Java's final is basically equivalent to a const pointer in C++. It does not provide the other features of const.

In Java, the qualifier final states that the affected data member or variable is not assignable, as below:

final int i = 3;
i = 4; // Error! Cannot modify a "final" object

It must be decidable by the compilers where the variable with the final marker is initialized, and it must be performed only once, or the class will not compile. Java's final and C++'s const keywords have the same meaning when applied with primitive variables.

const int i = 3; // C++ declaration
i = 4; // Error!

Considering pointers, a final reference in Java means something similar to const pointer in C++. In C++, one can declare a "constant pointer type".

Foo *const bar = mem_location; // const pointer type

Here, bar must be initialised at the time of declaration and cannot be changed again, but what it points is modifiable. I.e. *bar = value is valid. It just can't point to another location. Final references in Java work the same way except that they can be declared uninitialized.

final Foo i; // a Java declaration

Note: Java does not support pointers.[6] It is because pointers (with restrictions) are the default way of accessing objects in Java, and Java does not use stars to indicate them. For example, i in the last example is a pointer and can be used to access the instance.

One can also declare a pointer to "read-only" data in C++.

const Foo *bar;

Here bar can be modified to point anything, anytime; just that pointed value cannot be modified through bar pointer.

There is no equivalent mechanism in Java. Thus there are also no const methods. Const-correctness cannot be enforced in Java, although by use of interfaces and defining a read-only interface to the class and passing this around, one can ensure that objects can be passed around the system in a way that they cannot be modified.

Java collections framework provides a way to create an immutable wrapper of a Collection via Collections.unmodifiableCollection() and similar methods.

A method in Java can be declared "final", meaning that it cannot be overridden in subclasses.

C#

In C#, the qualifier readonly has the same effect on data members that final does in Java and the const does in C++; the modifier const has an effect similar (yet typed and class-scoped) to that of #define in C++. The other, inheritance-inhibiting effect of Java's final when applied to methods and classes is induced in C# with the aid of the keyword sealed.

Unlike C++, C# does not permit methods and parameters to be marked as const. However one may also pass around read-only subclasses, and the .NET Framework provides some support for converting mutable collections to immutable ones which may be passed as read-only wrappers.

By paradigm

Treatment of constants varies significantly by programming paradigm. Const-correctness is an issue in imperative languages like C++ because by default name bindings typically create variables, which can vary, as the name suggests, and thus if one wishes to mark a binding as constant this requires some additional indication.[b] In other programming language paradigms related issues arise, with some analogs to const-correctness found.

In functional programming, data are typically constant by default, rather than variable by default. Instead of assigning a value to a variable (a storage space with a name and potentially variable value), one creates a binding of a name to a value, such as by the let construct in many dialects of Lisp. In some functional languages, particularly multiparadigm ones such as Common Lisp, modifying data is commonplace, while in others it is avoided or considered exceptional; this is the case for Scheme (another Lisp dialect), which uses the set! construct to modify data, with the ! exclamation point drawing attention to this. Such languages achieve the goals of const-correctness by default, drawing attention to modification rather than constantness.

In a number of object-oriented languages, there is the concept of an immutable object, which is particularly used for basic types like strings; notable examples include Java, JavaScript, Python, and C#. These languages vary in whether user-defined types can be marked as immutable, and may allow particular fields (attributes) of an object or type to be marked as immutable.

In some multiparadigm languages that allow both object-oriented and functional styles, both of these features may be combined. For example, in OCaml object fields are immutable by default and must be explicitly marked with the keyword mutable to be mutable, while in Scala, bindings are explicitly immutable when defined with val for "value" and explicitly mutable when defined with var for "variable".

Naming conventions

Naming conventions for constants vary. Some simply name them as they would any other variable. Others use capitals and underscores for constants in a way similar to their traditional use for symbolic macros, such as SOME_CONSTANT.[7] In Hungarian notation, a "k" prefix signifies constants as well as macros and enumerated types.

One enforced convention is that in Ruby, any variable that begins with a capital letter is considered a constant, including class names.

See also

Notes

  1. ^ In some cases this can be circumvented, e.g. using self-modifying code or by overwriting the memory location where the value is stored.
  2. ^ This is not universal: in Ada input parameters and loop parameters are implicitly constant, for instance.

References

  1. ^ Ex. IBM Systems Information. Instruction Set - Assembler Language Reference for PowerPC.
  2. ^ Booch, Grady (1983). Software Engineering with Ada. Benjamin Cummings. pp. 116–117. ISBN 0-8053-0600-5.
  3. ^ a b c Schilling, Jonathan L. (April 1995). "Dynamically-Valued Constants: An Underused Language Feature". SIGPLAN Notices. 30 (4): 13–20. doi:10.1145/202176.202177. S2CID 17489672.
  4. ^ Perkins, J. A. Programming Practices: Analysis of Ada Source Developed for the Air Force, Army, and Navy. Proceedings TRI-Ada '89. pp. 342–354. doi:10.1145/74261.74287.
  5. ^ Timwi (2010-09-09). "Read-only ("const"-like) function parameters of C#". Stack Overflow. Retrieved 2012-05-06. [...] Then you can declare methods whose parameter type "tells" whether it plans on changing the variable or not:. [...] This mimics compile-time checks similar to constness in C++. As Eric Lippert correctly pointed out, this is not the same as immutability. But as a C++ programmer I think you know that.
  6. ^ "Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle". Java.sun.com. 2013-08-14. Retrieved 2013-08-18.
  7. ^ Microsoft Office XP Developer: Constant Names

Read other articles:

NHK紅白歌合戦 > 第3回NHK紅白歌合戦 第3回NHK紅白歌合戦 会場のNHK東京放送会館ジャンル 大型音楽番組放送方式 生放送放送期間 1953年(昭和28年)1月2日放送時間 19:30 - 21:00放送局 NHKラジオ第1公式サイト 公式サイトテンプレートを表示 第3回NHK紅白歌合戦ジャンル 大型音楽番組製作制作 NHK(総合テレビ) 放送放送国・地域 日本放送期間1953年(昭和28年)1月2日放送時

Village in Estonia Village in Järva County, EstoniaArkmaVillageCountry EstoniaCountyJärva CountyParishTüri ParishTime zoneUTC+2 (EET) • Summer (DST)UTC+3 (EEST) Arkma is a village in Türi Parish, Järva County in northern-central Estonia.[1] Politician Jüri Vilms (1889–1918) was born in Arkma. References ^ Classification of Estonian administrative units and settlements 2014 (retrieved 28 July 2021) 58°40′N 25°36′E / 58.667°N 25.600°E...

село Ісаківці Старий міст через Збруч у селі ІсаківціСтарий міст через Збруч у селі Ісаківці Країна  Україна Область Хмельницька область Район Кам'янець-Подільський район Громада Жванецька сільська громада Основні дані Засноване 1493 Населення 64 Площа 0,548 км² Густо...

Cet article est une ébauche concernant une chronologie ou une date et le Nunavut. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Chronologie du Nunavut ◄◄ 2004 2005 2006 2007 2008 2009 2010 2011 2012 ►► Chronologies Données clés 2005 2006 2007  2008  2009 2010 2011Décennies :1970 1980 1990  2000  2010 2020 2030Siècles :XIXe XXe  XXIe  XXIIe XXIIIeMillénaires&...

Este artículo o sección necesita referencias que aparezcan en una publicación acreditada.Este aviso fue puesto el 16 de junio de 2017. Morro do Diabo Vista desde el lugarLocalización geográficaContinente AméricaCordillera Sierra GeralCoordenadas 22°30′00″S 52°20′00″O / -22.5, -52.33333333Localización administrativaPaís BrasilDivisión Teodoro SampaioLocalización  Río Grande del Sur  BrasilCaracterísticas generalesTipo MontañaAltitud 650 m s. n. ...

Cirilo VI116º papa da Igreja Copta Info/Papa-Copta Nome de nascimento Azer Youssef Atta نظير جيد Nascimento Damanhur, 2 de agosto de 1902 Entronização 14 de novembro de 1971 Fim do pontificado 9 de março de 1971 (68 anos) Antecessor José II Sucessor Shenouda III Listas dos papas: cronológica Esta caixa: verdiscutir Papa Santo Cirilo VI de Alexandria ou Cirilo VI (nascido Azer Youssef Atta em 2 de agosto de 1902 – falecido em 9 de março de 1971) foi Papa e Patriarca d...

Disolución de la Gran Colombia Departamentos de la Gran Colombia en 1824LocalizaciónPaís  Gran ColombiaDatos generalesTipo disolución de una entidad territorial administrativaSuceso Disolución de la Gran Colombia en los Estados de Venezuela, Ecuador y Nueva GranadaCausa Discrepancia de opiniones entre federalistas y centralistas en cuanto a la forma de administrar el Estado[1]​HistóricoFecha 30 de abril de 1826 - 21 de noviembre de 1831[editar datos en Wikidata] ...

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada November 2022. Dito TsintsadzeDito Tsintsadze pada 2017LahirDmitri Tsintsadze2 Maret 1957 (umur 66)Tbilisi, GeorgiaPekerjaanSutradara, penulis naskahTahun aktif1988-kini Dito Tsintsadze (bahasa Georgia: დიტო ცინცაძე; lahir 2 Maret...

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Desember 2022. Reut NaggarNaggar, 2018Lahir02 Mei 1983 (umur 40)Tel Aviv, Israel Reut Naggar (lahir 2 Mei 1983) adalah seorang produser, wirausahawan budaya dan aktivis sosial Israel, yang utamanya berfokus pada LGBT dan hak wanita. Naggar adalah pendiri dan sa...

Concrete that is manufactured in a batch plant, according to a set engineered mix design This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Ready-mix concrete – news · newspape...

5th Ranger Infantry Company (Airborne)Scroll of the 5th ranger companyActiveNovember 20, 1950 - 1 August 1951Country United States of AmericaAllegianceUnited States ArmyBranchActive dutyTypeRanger light infantryRoleIrregular warfareSizeCompanyPart ofEighth United States ArmyGarrison/HQPusan, South KoreaEngagementsKorean WarCommandersNotablecommandersCaptain John C. Nail ScagnelliMilitary unit The 5th Ranger Infantry Company (Airborne) was an airborne trained light infantry unit of t...

Soviet/Russian 8-bit home computer, based on the Sinclair ZX Spectrum hardware architecture HobbitAlso known asХоббит (russian)TypeHome computerRelease date1990; 33 years ago (1990)Operating systemSinclair BASIC, Logo, CP/M, ForthCPUclone of Zilog Z80 @ 3.5 MHzMemory64 KB including 6.5 KB screen memoryRemovable storageInternal 3.5 drive, external 5.25 drivesDisplayComposite video out, EGA monitorSoundBeeper, AY8910ConnectivityJoystick ports, Centronics, RS-232, audio i...

1957 US film by Ed Wood This article is about the film. For the video game of the same title, see Plan 9 from Outer Space (video game). Plan 9 from Outer SpaceTheatrical release poster by Tom JungDirected byEdward D. Wood Jr.Written byEdward D. Wood Jr.Produced byEdward D. Wood Jr.[1]Starring Gregory Walcott Bela Lugosi Maila Nurmi Tor Johnson Lyle Talbot Narrated byCriswellCinematographyWilliam C. ThompsonEdited byEdward D. Wood Jr.Music bysee MusicProductioncompaniesReynolds Picture...

Type of cell death Coagulative necrosis is a type of accidental cell death typically caused by ischemia or infarction. In coagulative necrosis, the architectures of dead tissue are preserved for at least a couple of days.[1] It is believed that the injury denatures structural proteins as well as lysosomal enzymes, thus blocking the proteolysis of the damaged cells. The lack of lysosomal enzymes allows it to maintain a coagulated morphology for some time. Like most types of necrosis, i...

Координати: 50°27′03″ пн. ш. 30°27′58″ сх. д. / 50.45083° пн. ш. 30.46611° сх. д. / 50.45083; 30.46611 Політехнічний інститут Київський метрополітенСвятошинсько-Броварська лінія Загальні даніТип пілонна трисклепіннаПлатформиКількість 1Тип острівнаФорма прям...

American labor unionist and political theorist For the German racing cyclist, see Maximilian Schachmann. This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Max Shachtman – news · newspapers · books · scholar · JSTOR (March 2021) (Learn how and when to remove this template message) Max ShachtmanBorn(1904-09-10)S...

Greek naval officer Nikolaos TsounisNative nameΝικόλαος ΤσούνηςBornAthensAllegiance GreeceService/branch Hellenic NavyYears of service1979–2020RankAdmiralCommands held Chief of the Navy General Staff Admiral Nikolaos Tsounis (Greek: Νικόλαος Τσούνης) is a Greek naval officer, and a former Chief of the Hellenic Navy General Staff. Biography Nikolaos Tsounis was born in Athens, and entered the Hellenic Navy Academy in 1979, graduating in June 1983 ...

Indian film director This article is about the screenwriter and director. For the conductor, see Harish Shankar (conductor). Harish ShankarShankar at the success meet of Mahanati in May 2018Born (1979-03-31) 31 March 1979 (age 44)[1]Dharmapuri, Andhra Pradesh (now in Telangana), IndiaAlma materOsmania UniversityOccupationsFilm directorscreenwriter Sanganabhatla Harish Shankar (born 31 March 1979) is an Indian film director and screenwriter known for his works exclusively in ...

El pacto Serie de televisión Creado por INCAAGuion por Marcelo CamañoDirigido por Pablo FischermanProtagonistas Cecilia Roth Federico Luppi Mike Amigorena Eusebio Poncela Luis Ziembrowski Cristina BanegasTema principal El pacto(compuesto por Vicentico)N.º de temporadas 1N.º de episodios 13ProducciónProductor(es) ejecutivo(s) Nadia JackyProductor(es) Sebastián Rollandi Javier NirDuración 60 minutosEmpresa(s) productora(s) Tostaki OrugaLanzamientoMedio de difusión América TVHorario Lun...

Federico Aparici Información personalNombre de nacimiento Federico Aparici y Soriano Nacimiento 4 de febrero de 1832 Valencia (España) Fallecimiento 30 de noviembre de 1917 (85 años)Madrid (España) Nacionalidad EspañolaEducaciónEducado en Escuela Técnica Superior de Arquitectura de Madrid (hasta 1855) Información profesionalOcupación Arquitecto Empleador Escuela Técnica Superior de Arquitectura de MadridReal Instituto Industrial de Madrid Obras notables basílica de Santa Marí...