Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по дисциплине АОП.docx
Скачиваний:
66
Добавлен:
24.04.2019
Размер:
2.91 Mб
Скачать

Int main() {

int a = 12, b, c;

printf("result = %d \n", c=(b=a)-5);

system("PAUSE");

return 0;

}

Вопрос №23. Операции, совмещенные с присваиванием.

В языке С операция присваивания немного отличается от аналогичной операции в других языках:

Кроме обычного присваивания существует ещё 10 модификаций, в которых присваивание совмещается с какой-либо бинарной операцией, например, k += 2 эквивалентно k = k + 2, или ещё: x >>= 1 эквивалентно x = x >> 1 и т.д. Полный перечень бинарных операций, совмещаемых с присваиванием:

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

#include <stdio.h>

#include <stdlib.h>

// Подсчет количества единичных битов в двух байтах

Int main() {

unsigned short x = 0x1234;

int b;

for (b=0; x!=0; x >>= 1)

if (x & 01) b++;

printf("the number of bits = %d \n", b);

system("PAUSE");

return 0;

}

Вопрос №24. Тернарная условная операция.

Во многих алгоритмах часто встречается конструкция вида:

if ( условие) x=<выраж1>;

else x=<выраж2>;

Иными словами, переменная x получает значение одного из двух выражений, в зависимости от истинности условия.

В языке С для компактной записи подобного фрагмента существует специальная тернарная условная операция:

x = условие ? <выраж1> : <выраж2>

#include <stdio.h>

#include <stdlib.h>

#define N 57

Int main() {

int i, x[N];

for (i=0; i<N; x[i]=++i);

for (i=0; i<N; ++i)

printf("%6d%c", x[i], (i%8==7 || i==N-1) ? '\n' : ' ');

system("PAUSE");

return 0;

}

Вопрос №25. Приоритет и ассоциирование операций.

Операции

Ассоциирование

Кол.

1

() [] -> .

4

2

! ~ ++ -- + - * & (тип) sizeof

12

3

* / %

3

4

+ -

2

5

<< >>

2

6

< <= > >=

4

7

== !=

2

8

&

1

9

^

1

10

|

1

11

&&

1

12

||

1

13

?:

1

14

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

11

15

,

1

Всего операций: 47

Операции, находящиеся в одной строке таблицы , принадлежат одной группе: имеют одинаковый приоритет и одинаковый порядок выполнения (слева направо или наоборот).

Все 47 операций распределены по 15 группам, группа 1 имеет наивысший приоритет, а группа 15 наинизший приоритет.

1-я группа: () - вызов функции, [] – доступ к элементу массива, -> - обращение к элементу структуры через указатель, . - обращение к элементу структуры через имя структуры.

2-я группа (унарные операции): + - - унарные «плюс» и «минус», * - «разыменование» указателя, т.е. обращение к объекту, на который он указывает, & - получение адреса объекта, (тип) – приведение типа операнда, sizeof – определение размера объекта.

15-я группа: , - операция «запятая» - это бинарная операция имеющая вид: выражение1 , выражение2. Действие операции заключается в последовательном вычислении выражений, а её результатом является значение второго выражения.

Вопрос №26. Понятие термина «приведение типа». Явное и неявное приведения типов. Корректные приведения типов.

Приведение типа (type conversion) — преобразование значения одного типа в значение другого типа.

Выделяют явное и неявное приведения типов.

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

  • при неявном приведении преобразование происходит автоматически, по правилам, заложенным в языке программирования.

Корректными преобразования типов, не вызывающими искажения значений или потери точности, являются приведения более «узких» типов к более «широким».

Если же значение более «широкого» типа приводится к более «узкому» типу, возможно искажение значения или потеря точности, о чем выдает предупреждение (warning) компилятор.

Явные преобразования типов всегда происходят по «инициативе» программиста, а инициатором неявных преобразований выступает компилятор в тех случаях, когда при выполнении операции ожидается один тип, а фактически присутствует другой тип.

Замечание. В некоторых случаях неявное преобразование бывает просто неосуществимым «по определению». Например, в выражении 3.0%2.0 значения 3.0 и 2.0 не преобразуется автоматически к целому типу, т.к. операция % применима только к целочисленным значениям и поэтому компилятор выдаст сообщение об ошибке (error).

Управляющие конструкции языка С.

Вопрос №27. Простой оператор. Составной оператор (блок). Локальные переменные. Вложенные блоки.

  • Если в конце любого выражения поставить символ ; (точка с запятой), получим элементарную «строительную конструкцию» программы – простой оператор:

z = foo(x+y); x+=y; 2=4*5; …

  • Простые операторы в программе могут располагаться последовательно, друг за другом:

temp = x+y; z = foo(temp);

  • Последовательность простых операторов можно заключить в фигурные скобки { и }. В этом случае получится составной оператор, или, иначе – блок, который синтаксически эквивалентен простому оператору и компилируется как самостоятельная конструкция. После закрывающей скобки точка с запятой не ставится.

  • Блок может быть пустым: {}

  • Внутри блока можно размещать объявления переменных:

{

int temp = x+y;

z = foo(temp);

}

Такие переменные будут локальными; они будут создаваться при входе в блок и исчезать при выходе из блока. За пределами блока локальные переменные невидимы.

  • Блоки могут быть вложенными (глубина вложенности не ограничивается)

{

int temp = x+y;

z = foo(temp);

{

float temp2 = xy;

z += bar(temp2);

}

}

Вопрос №28. Операторы простого выбора if и if … else.

В простейшем случае требуется выбрать для выполнения определенный оператор, если некоторое условие истинно (т.е. его значение отлично от 0). Это записывается так: