对于第一个问题,(a+b)++
表示“将值增加a+b
1”。
但是,您不能 increment 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);
请注意,这只是安全的,因为您知道 in 字符串的p1
大小不大于p2
. 如果您不确定字符串的大小(例如,如果您从用户输入中获取字符串),则需要小心,如 Wikipedia 中所述。
至于为什么while(++*p2=++*p1);
不起作用,while 起作用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 编译器解决该等式,因此为了保持语言的简单和高效,这种事情是被禁止的。