4.4. Операции присваиванияИнициализация задает начальное значение переменной. Например: int ival = 1024; int *pi = 0; В результате операции присваивания объект получает новое значение, при этом старое пропадает: ival = 2048; pi = &iva1; Иногда путают инициализацию и присваивание, так как они обозначаются одним
и тем же знаком =. Объект инициализируется только один раз – при его определении.
В то же время операция может быть применена к нему многократно. 1024 = ival; // ошибка Возможно, имелось в виду следующее: int value = 1024; value = ival; // правильно Однако недостаточно потребовать, чтобы операнд слева от знака присваивания был l-значением. Так, после определений const int array_size = 8;
int ia[ array_size ] = { 0, 1, 2, 2, 3, 5, 8, 13 };
int *pia = ia;
выражение array_size = 512; // ошибка ошибочно, хотя array_size и является l-значением: объявление array_size константой не дает возможности изменить его значение. Аналогично ia = pia; // ошибка Неверна и инструкция extern char next_char();
int main()
{
char ch = next_char();
while ( ch != '\n' ) {
// сделать что-то ...
ch = next_char();
}
// ...
}
может быть переписан так:
extern char next_char();
int main()
{
char ch;
while (( ch = next_char() ) != '\n' ) {
// сделать что-то ...
}
// ...
}
Заметим, что вокруг выражения присваивания необходимы скобки, поскольку приоритет
этой операции ниже, чем операции сравнения. Без скобок первым выполняется сравнение: int main ()
{
int ival, jval;
ival = jval = 0; // правильно: присваивание 0 обеим переменным
// ...
}
Обеим переменным ival и jval присваивается значение 0. Следующий пример неправилен, потому что типы pval и ival различны, и неявное преобразование типов невозможно. Отметим, что 0 является допустимым значением для обеих переменных: int main ()
{
int ival; int *pval;
ival = pval = 0; // ошибка: разные типы
// ...
}
Верен или нет приведенный ниже пример, мы сказать не можем, поскольку определение jval в нем отсутствует: int main()
{
// ...
int ival = jval = 0; // верно или нет?
// ...
}
Это правильно только в том случае, если переменная jval определена в программе ранее и имеет тип, приводимый к int. Обратите внимание: в этом случае мы присваиваем 0 значение jval и инициализируем ival. Для того чтобы инициализировать нулем обе переменные, мы должны написать: int main()
{
// правильно: определение и инициализация
int ival = 0, jval = 0;
// ...
}
В практике программирования часты случаи, когда к объекту применяется некоторая операция, а результат этой операции присваивается тому же объекту. Например: int arraySum( int ia[], int sz )
{
int sum = 0;
for ( int i = 0; i < sz; ++i )
sum = sum + ia[ i ];
return sum;
}
Для более компактной записи С и С++ предоставляют составные операции присваивания. С использованием такого оператора данный пример можно переписать следующим образом: int arraySum( int ia[], int sz )
{
int sum = 0;
for ( int i =0; i < sz; ++i )
// эквивалентно: sum = sum + ia[ i ];
sum += ia[ i ];
return sum;
}
Общий синтаксис составного оператора присваивания таков: += -= *= /= %= <<= >>= &= ^= |= Запись a op= b в точности эквивалентна записи a = a op b. Упражнение 4.6Найдите ошибку в данном примере. Исправьте запись. int main() {
float fval;
int ival;
int *pi;
fval = ival = pi = 0;
Упражнение 4.7Следующие выражения синтаксически правильны, однако скорее всего работают не так, как предполагал программист. Почему? Как их изменить? (a) if ( ptr = retrieve_pointer() != 0 ) (b) if ( ival = 1024 ) (c) ival += ival + 1;Назад Вперед Содержание |
Нет комментариев. Оставить комментарий: |