Spec-Zone.ru › C

Выражения

Выражение — это последовательность операторов и их операндов, задающая вычисление.

Вычисление выражения может давать результат (например, вычисление 2 + 2 даёт результат 4), может иметь побочные эффекты (например, вычисление printf("%d", 4) отправляет символ '4' в стандартный поток вывода) и может обозначать объекты или функции.

Общие сведения

  • категории значений (lvalue, объект, не являющийся lvalue, обозначение функции) классифицируют выражения по их значениям
  • порядок вычисления аргументов и подвыражений задаёт порядок получения промежуточных результатов

Операторы

Распространённые операторы
присваивание инкремент
декремент
арифметические логические сравнения доступ к
членам
прочие

a = b a += b a -= b a *= b a /= b a %= b a &= b a |= b a ^= b a <<= b a >>= b

++a --a a++ a--

+a -a a + b a - b a * b a / b a % b ~a a & b a | b a ^ b a << b a >> b

!a a && b a || b

a == b a != b a < b a > b a <= b a >= b

a[b] *a &a a->b a.b

a(...) a, b (type) a a ? b : c sizeof

_Alignof
(начиная с C11)
(до C23 включительно)

alignof
(начиная с C23)

  • приоритет операторов задаёт порядок связывания операторов с их аргументами
  • альтернативные представления — это альтернативные написания некоторых операторов

Преобразования

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

Прочее

  • константные выражения могут вычисляться во время компиляции и использоваться в контексте времени компиляции (размеры массивов не VLA(начиная с C99), статические инициализаторы и т. д.)
  • обобщённые выборы позволяют выполнять разные выражения в зависимости от типов аргументов
(начиная с C11)
  • Операции с числами с плавающей точкой могут вызывать исключения и сообщать об ошибках, как указано в math_errhandling
  • Стандартные #прагмы FENV_ACCESS, FP_CONTRACT и CX_LIMITED_RANGE, а также точность вычислений с плавающей точкой и направление округления управляют выполнением операций с плавающей точкой.
(начиная с C99)

Первичные выражения

Операндами любого оператора могут быть другие выражения или первичные выражения (например, в 1 + 2 * 3 операндами оператора+ являются подвыражение 2 * 3 и первичное выражение 1).

К первичным выражениям относятся:

1) Константы и литералы (например, 2 или "Hello, world")
2) Надлежащим образом объявленные идентификаторы (например, n или printf)
3) Обобщённые выборы (начиная с C11)

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

Константы и литералы

Константные значения некоторых типов можно встраивать в исходный код программы на C с помощью специальных выражений, называемых литералами (для выражений-lvalue) и константами (для выражений, не являющихся lvalue)

  • целочисленные константы — это десятичные, восьмеричные или шестнадцатеричные числа целочисленного типа.
  • символьные константы — это отдельные символы типа int, подходящие для преобразования в символьный тип, или типа char8_t,(начиная с C23) char16_t, char32_t или(начиная с C11) wchar_t
  • константы с плавающей точкой — это значения типа float, double или longdouble
  • предопределённые константы true/false — это значения типа bool
  • предопределённая константа nullptr — это значение типа nullptr_t
(начиная с C23)
  • строковые литералы — это последовательности символов типа char[], char8_t[](начиная с C23), char16_t[], char32_t[],(начиная с C11) или wchar_t[], представляющие строки с завершающим нулевым символом
  • составные литералы — это значения структурного, объединённого или массивного типа, непосредственно встроенные в код программы
(начиная с C99)

Невычисляемые выражения

Операнды оператора sizeof — это выражения, которые не вычисляются (если только они не являются VLA)(начиная с C99). Поэтому size_t n = sizeof(printf("%d", 4)); не выполняет вывод в консоль.

Операнды оператора _Alignof(до C23 включительно)alignof(начиная с C23), управляющее выражение обобщённого выбора и выражения размера VLA, являющиеся операндами _Alignof(до C23 включительно)alignof(начиная с C23), также являются выражениями, которые не вычисляются.

(начиная с C11)

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
    • 6.5 Выражения (с.: TBD)
    • 6.6 Константные выражения (с.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 6.5 Выражения (с.: 55–75)
    • 6.6 Константные выражения (с.: 76–77)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 6.5 Выражения (с.: 76–105)
    • 6.6 Константные выражения (с.: 106–107)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 6.5 Выражения (с.: 67–94)
    • 6.6 Константные выражения (с.: 95–96)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
    • 3.3 ВЫРАЖЕНИЯ
    • 3.4 КОНСТАНТНЫЕ ВЫРАЖЕНИЯ

См. также

Документация по C++ о выражениях

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/language/expressions

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API