Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
61
Добавлен:
06.06.2015
Размер:
126.21 Кб
Скачать
x A[x]
f (x, y)

Выражения и подвыражения

<постфиксное-выражение>::= <первичное-выражение>

| <постфиксное-выражение> '[' <выражение> ']'

|<постфиксное-выражение>

 

 

point.x

|

'(' [<список-аргументов-выражений>] ')'

<постфиксное-выражение> '.'

point->x

<идентификатор>

i++

|

<постфиксное-выражение> '->'

i--

<идентификатор>

 

|

<постфиксное-выражение> '++'

 

|

<постфиксное-выражение> '--'

 

Выражения и подвыражения

<первичное-выражение>::=

 

 

<идентификатор>

x

|

<константа>

1.25f

|

<строка>

"ABCDEF"

|

'(' <выражение> ')'

(x+y)

Выражения и подвыражения

<константа>::= <целая-константа>

| <символьная-константа> | <константа-с-плавающей- точкой>

| <константа-перечисление>

Выражения и подвыражения

<список-аргументов- выражений>::=

<выражение-присваивания> | <список-аргументов-выражений> ','

<выражение-присваивания>

Классы, приоритеты и ассоциативность операций

языкаОперацииСи Си делятся на 5 классов по числу и расположению

аргументовЗапись одной операции состоит из

Класс ЧислонесколькихПоложение

аргументов операции отн. аргументов

Атомарные

0

 

Префиксны

1

Перед

е

 

 

Постфиксн

1

После

ые

 

 

Бинарные

2

Между

Классы, приоритеты и ассоциативность операций

языкаВ сложных выраженияхСи операции связываются с аргументами по убыванию их приоритетов

Приоритеты задаются целыми числами

Пример

Приоритет * = 13, приоритет + = 12 ==> x*x+y*y -- это (x*x)+(y*y), а не x*(x+y)*y и не (x*x+y)*y и не x*(x+y*y)

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

Ассоциативность операции – порядок связывания с аргументами для операций одного приоритета

Слева направо, справа налево, без ассоциативности

Пример

Так как ассоциативность / "слева направо", x/y*z – это (x/y)*z, а не x/ (y*z)

Операция без ассоциативности подряд + что-то ещё -- синтаксическая ошибка – например, k++ k--

Приоритеты операций в

языке

 

Лексемы Операция

Класс

Приор

 

Переменн

ые

Константы a[k]

f(…)

.

->

k++ k-- ++k --k

sizeof

Значение константы или доступ к переменной

Доступ к элементу массива

Вызов функции

Доступ к полю структуры или объединения

Доступ к полю структуры или объединения через указатель

Доступ к значению k и послед. увеличение или уменьшение k на 1

Увеличение или уменьшение k на 1 и послед. доступ к полученному значению k

Размер значения или типа в байтах

~

Побитовое НЕ

атомарны

й

постфиксн

ый

постфиксн

ый

постфиксн

ый

постфиксн

ый

постфиксн

ый

префиксн

ый

префиксн

ый

префиксн

ый

16

16

16

16

16

16

15

15 15

Ассоц- ность

нет

слева

направо

слева

направо

слева

направо

слева

направо

слева

направо

справа

налево

справа

налево

справа

налево

Приоритеты операций в

языке Си

Класс

Лексемы Операция

 

Приор

 

 

*

(имя типа)

* / %

+ -

<< >>

< > <= >=

== !=

&

^

|

&&

|| с ? в1 : в2

Доступ через указатель

Явное изменение (преобразование) типа

Умножение, деление, остаток от деления

Сложение, вычитание чисел

Сдвиг влево или вправо в 2 с.с.

Сравнение чисел

Проверка равенства и различия

Побитовое И

Побитовое исключающее ИЛИ

Побитовое ИЛИ

Логическое И

Логическое ИЛИ

в1 (если с != 0) или в2 (если с == 0)

префиксн

15

ый

 

префиксн

14

ый

 

бинарный

13

бинарный

12

бинарный

11

бинарный

10

бинарный

9

бинарный

8

бинарный

7

бинарный

6

бинарный

5

бинарный

4

тернарны

3

й

 

Ассоциативн

ость

справа налево

справа налево

слева направо

слева направо

слева направо

слева направо

слева направо

слева направо

слева направо

слева направо

слева направо

слева направо справа налево

Приоритеты операций в языке Си

Лексемы

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

,

Операция

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

Последовательное вычисление аргументов

Класс

Приор

Ассоц-

ность

 

бинарн

2

справа

ый

налево

 

бинарн

1

слева

ый

направо

 

Выражения и подвыражения

Классы, приоритеты и ассоциативность операций языка Си

Далее

Выражения l-value

Порядок вычисления выражений, точки следования, побочные эффекты

Неявные преобразования типов