Для первого вопроса (a+b)++
означает «увеличить значение a+b
на 1».
Вы не можете увеличить a+b
, поскольку это не переменная. Что бы вы ожидали в следующем коде?
int a = 1, b = 2;
printf("a = %d, b = %d, a+b = %d\n", a, b, a+b);
(a+b)++;
printf("a = %d, b = %d, a+b = %d\n", a, b, a+b);
Ясно, что первое printf
должно напечатать
a = 1, b = 2, a + b = 3
А как насчет второго?
a =?, B =?, A + b = 4
Непонятно, какими должны быть a или b, если мы увеличиваем сумму.
Что касается второго вопроса, помните, что вы меняете p2
при копировании данных, поэтому, когда вы просите распечатать то, на что оно указывает, оно указывает на конец строки, а не на начало.
Более простой способ сделать копию строки - использовать strcpy
, вот так:
strcpy(p2, p1);
Обратите внимание, это безопасно только потому, что вы знаете, что размер строки в p1
не превышает размер p2
. Если вы не уверены в размере строка (например, если вы получаете строку из пользовательского ввода), вам нужно быть осторожным, , как указано в Википедии .
Почему while(++*p2=++*p1);
не работает, а while(*p2++=*p1++);
:
Postfix- ++
имеет более высокий приоритет, чем *
. Это означает, *p2++
означает *(p2++)
.
Так
*(p2++) = something;
совпадает с
*p2 = something;
p2 += 1;
Между тем, ++*p2
означает ++(*p2)
, или «на что указывает p2
указывает, увеличено на единицу».
Опять вы получите проблему, если скажете:
int a = 5, *p2 = &a;
++*p2 = 10;
printf("a = %d\n", a);
Что вы ожидаете, что это напечатает? Во всяком случае, он должен вывести 9, потому что вы сообщаете компилятору, что *p2+1 = 10
.
Вы не можете ожидать, что C-компилятор решит это уравнение, поэтому, чтобы язык был простым и эффективным, подобные вещи запрещены.