Выражение, подобное этому
*ss++
, можно эквивалентно переписать, например,
*( ss++ )
То есть оператор приращения постфикса ++
имеет более высокий приоритет, чем унарный оператор *
.
В соответствии со стандартом C (6.5.2.4 Операторы увеличения и уменьшения Postfix, стр. # 2)
2 Результатом оператора postfix ++ является значениеоперанд.Как побочный эффект, значение объекта операнда увеличивается (то есть к нему добавляется значение 1 соответствующего типа).... Расчет значения результата выполняется до появления побочного эффекта обновления сохраненного значения операнда ....
Так что, если, например, указатель ss
указывает на первый символстроки s
, то значение выражения ss++
является этим адресом, и только после возврата адреса указатель увеличивается на единицу.
Тогда возвращаемый указатель, который является значением выражения ss++
, равенразыменовывается и значение выражения *( ss++ )
является первым символом строки, хранящейся в массиве s
.
Аналогично значение выражения *( tt++ )
является объектом, на который указывает указатель tt
до его увеличения.
Таким образом, первый символ массива t
назначается с первым символом массива s
.
Далее в соответствии со стандартом C (6.5.16Операторы присваивания, стр. # 3)
3 Оператор присваивания сохраняет значение в объекте, обозначенном левым операндом.Выражение присваивания имеет значение левого операнда после присваивания (111), но не является lvalue ....
Таким образом, на первом шаге цикла значением оператора присваивания являетсясимвол 'l'
.
И наконец (6.8.5 Операторы итерации, стр. # 4)
4 Оператор итерации приводит к многократному выполнению оператора, называемого телом циклапока контрольное выражение не сравнится равным 0 ...
Поскольку результат выражения присваивания (символ 'l'
) не равен 0, цикл продолжается.Он будет выполняться до тех пор, пока выражение *( ss++ )
не возвратит завершающий нулевой символ '\0'
массива s
, который назначен массиву t
с использованием выражения присваивания *tt++ = *ss++
.
Как в этомЕсли результатом выражения присваивания является символ '\0'
(который повышается до 0
типа int
), то цикл прекращает свои итерации.
В результате массив t
содержитстрока хранится в массиве s
.