Если при инициализации указано меньше значений для строк, то оставшиеся элементы инициализируются 0, т. е. при описании
static int b[2][2] = { { 1,2 }, { 3 } };
элементы первой строки получат значения 1 и 2, а второй — 3 и 0.
При инициализации составных объектов нужно внимательно следить за использованием скобок и списков инициализаторов.
Примеры:
struct complex { float real;
float imag; } comp [2] [3] =
{ { {1,1}, {2,3}, {4,5} },
{ {6,7}, {8,9}, {10,11} } };
В данном примере инициализируется массив структур comp из двух строк.
Рассмотрим пример неправильной инициализации аналогичного массива. Ошибка связана с неправильным употреблением фигурных скобок.
struct complex comp2 [2][3] = { {1,1}, {2,3}, {4,5}, {6,7}, {8,9}, {10,11} };
В этом примере компилятор интерпретирует рассматриваемые фигурные скобки следующим образом:
— первая левая фигурная скобка — начало составного инициатора для массива
— вторая левая фигурная скобка — начало инициализации первой строки массива
— первая правая скобка (после 1) указывает компилятору, что список инициаторов для строки массива окончен, и элементы оставшихся структур в строке
— аналогично список {2,3} инициализирует первую структуру в строке
— на следующий список инициализаторов {4,5} компилятор будет сообщать о возможной ошибке, т. к. строка 3 в массиве,
При инициализации объединения задается значение первого элемента объединения в соответствии с его типом.
Пример:
union tab { unsigned char name[10);
int tabl;
} pers = {'A', 'H', 'T', 'O', 'H'};
Инициализируется переменная pers.name, и т. к. это массив, для его инициализации требуется список значений в фигурных скобках. Первые пять элементов массива инициализируются значениями из списка, остальные — нулями.
Инициализацию массива символов можно выполнить, используя литеральную строку.
char stroka[] = «привет";
Инициализируется массив символов из 7 элементов, последним элементом (седьмым) будет символ '\0', которым завершаются все литеральные строки.
В том случае, если задается размер массива, а литеральная строка длиннее, чем размер массива, то лишние символы отбрасываются.
Следующее определение инициализирует переменную stroka литеральной строкой, состоящей из семи элементов.
char stroka[5] = «привет";
В переменную stroka попадают первые пять элементов литерала, а символы 'T' и '\0' отбрасываются.
Если строка короче, чем размер массива, то оставшиеся элементы массива заполняются нулями.
Отметим, что инициализация объединения типа tab может иметь следующий вид:
union tab pers1 = «Антон";
и, таким образом, в символьный массив попадут символы:
'А', 'н' 'т', 'о', 'н', '\0',
а остальные элементы будут инициализированы нулем.
А+В
A*(B+C)-(D-E)/F
Выражение в языке программирования С-51 состоит из операндов, которые комбинируются при помощи различных арифметических или логических операций, а также операций отношения. Над переменными-указателями возможно проведение адресных операций.
При вычислении выражений тип каждого операнда может быть преобразован к другому типу. Преобразования типов могут быть неявными, при выполнении операций и вызовов функций, или явными, при использовании функций приведения типов. Из-за того, что неявные преобразования типов могут различаться для трансляторов разных фирм, лучше при написании программы использовать явное преобразование. Примеры явных преобразований типов операндов:
а=(int)b+(int)с; //Переменные
s=sin((float)a/15)); //Если не преобразовать тип переменной