2 * 3 + 1
равно 7. Но как получится, если я сделаю int i = 3 + 1;
, а затем 2 * i
даст 8? Разве переменная не должна быть заменена ее первоначальным значением?
Это потому, что 2 * 3 + 1
интерпретируется как (2 * 3) + 1
, а 2 * i
совпадает с 2 * (3 + 1)
. Они означают разные вещи и работают на разные номера. Когда вы даете 3 + 1
имя, когда вы используете имя, оно не разбивает число обратно на 3 + 1
, чтобы только умножить 3.
Причина, по которой const char *
отличается от const pstring
, очень похожа. const char *
интерпретируется как (const char) *
, то есть указатель на постоянный символ. Но const pstring
- это то же самое, что и const (char *)
, то есть постоянный указатель на символ. pstring
сам по себе является целым типом, и когда вы делаете const pstring
, он не разделяет char *
, чтобы сделать char
часть постоянной.
Примечание: если вы сделали #define pstring char *
, то const pstring
будет таким же, как const char *
, потому что макросы (#define
s) просто обрабатываются как замены текста.