Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
12
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

2.4.4.6Литерал null

литерал_null: null

Литерал_null может быть неявно преобразован в ссылочный тип или обнуляемый тип.

2.4.5Операторы и знаки пунктуации

Существует несколько видов операторов и знаков пунктуации. Операторы используются в выражениях для описания операций, включающих один или более операндов. Например, в выражении a + b используется оператор + для сложения двух операндов a и b. Знаки пунктуации служат для группирования и разделения.

оператор_или_знак_пунктуации: один из следующих: { } [ ] ( ) . , : ; + - * / % & | ^ ! ~ = < > ? ?? :: ++ -- && || -> == != <= >= += -= *= /= %= &= |= ^= << <<= =>

сдвиг_вправо: >|>

присваивание_сдвига_вправо: >|>=

Вертикальная черта в порождениях сдвиг_вправо и присваивание_сдвига_вправо указывает, что, в отличие от других порождений в синтаксической грамматике, никакие символы (даже пробелы) не допустимы между этими лексемами. Эти порождения обрабатываются особо, чтобы сделать возможной правильную обработку списков_параметров_типа (§10.1.3).

2.5Препроцессорные директивы

Препроцессорные директивы дают возможность условно пропускать разделы исходных файлов, сообщать об условиях ошибок и предупреждений и устанавливать отдельные области исходного кода. Термин «препроцессорные директивы» используется только для сохранения единообразия с языками программирования C и C++. В C# нет отдельного шага предварительной обработки; препроцессорные директивы обрабатываются как часть этапа лексического анализа.

ПП_директива: ПП_описание ПП_условное_выражение ПП_строка ПП_диагностика ПП_область ПП_pragma

Доступны следующие препроцессорные директивы:

  • #define и #undef, используемые, соответственно, для определения и отмены определения символов условной компиляции (§2.5.3);

  • #if, #elif, #else и #endif, используемые для условного пропуска разделов исходного кода (§2.5.4);

  • #line, используемая для управления номерами строк, выдаваемыми для ошибок и предупреждений (§2.5.7);

  • #error и #warning, используемые для выдачи, соответственно, ошибок и предупреждений (§2.5.5);

  • #region и #endregion, используемые для явного выделения разделов исходного кода (§2.5.6);

  • #pragma, используемая для задания компилятору необязательных сведений о контексте (§2.5.8).

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

Исходная строка, содержащая директиву #define, #undef, #if, #elif, #else, #endif или #line, может оканчиваться однострочным комментарием. Комментарии с разделителями (вид комментариев с /* */) не разрешены в исходных строках, содержащих препроцессорные директивы.

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

#define A #undef B

class C { #if A void F() {} #else void G() {} #endif

#if B void H() {} #else void I() {} #endif }

приведет к той же последовательности лексем, что и программа:

class C { void F() {} void I() {} }

Таким образом, несмотря на то, что лексически эти программы различаются, синтаксически они идентичны.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]