Любой однозначный литерал является константным выражением.
3 0.0f '\n'
(Строковые литералы странные, потому что они на самом деле массивы. Кажется, "hello"
на самом деле не является константой, так как в конечном итоге приходится связывать и все такое, а адрес и содержимое могут меняться во время выполнения.)
Большинство операторов (sizeof, приведений и т. Д.), Применяемых к константам или типам, являются константными выражениями.
sizeof(char)
(byte) 15
Любое выражение, включающее только константные выражения, само по себе также является константным выражением.
15 + 3
0.0f + 0.0f
sizeof(char)
Любое выражение, включающее вызовы функций или неконстантные выражения, обычно не константное выражение.
strlen("hello")
fifteen + x
Статус любого макроса как константного выражения зависит от того, к чему он расширяется.
/* Always a constant */
#define FIFTEEN 15
/* Only constant if (x) is
#define htons(x) (( ((x) >> 8) | ((x) << 8) ) & 0xffff)
/* Never constant */
#define X_LENGTH strlen(x)
Изначально у меня было кое-что о const
идентификаторах, но я проверил это и, очевидно, это не относится к C. const
, как ни странно, не объявляет константы (по крайней мере, не те) константы "достаточно для использования в switch
выражениях). В C ++, однако, это так.