char destination[6];
char source[] = "hello";
char* a = destination;
char* b = source;
while (*a++ = *b++);
return destination;
它是否将 *a 设置为 *b,然后检查值是否 != 0,然后递增指针?
或者它是否做了一些事情,比如增加指针,然后检查之前的 *a = *b 值,然后检查 != 0?
while 循环,如下所示:
while (<expr>) <body>;
执行时,就好像它是:
while (true) {
int temp = <expr>;
if (!temp) {
break;
}
<body>
}
因此,在测试值是否为零之前,它会评估整个<expr>
,包括任何副作用(例如赋值和增量(。
表达式 temp = *a++ = *b++
的计算公式为:
int new_a = a + 1; int new_b = b + 1; // These may be evaluated in either order
temp = (*a = *b); // value of temp will be that value that was assigned to *a
a = new_a; b = new_b; // Also in either order
因此,测试的值是在变量递增之前分配的值。
首先,计算 *b 并将值分配给 *a。
其次,++的副作用发生(a++和b++(。
第三,使用后置增量前的 *a 值来决定是进入还是退出循环。
换句话说,您可以将程序转换为以下等效表示形式:
int main(){
char destination[6];
char source[] = "hello";
char* a = destination;
char* b = source;
while (1){
*a=*b;
int tmp=*a;
a = a + 1;
b = b + 1;
if (!(tmp))
break;
// the original loop body comes here
}
return 0;
}
postincrement 运算符首先在其表达式的上下文中使用其操作数,然后递增其值。
所以在这种情况下,你是对的。 它将*a
设置为*b
然后递增a
和b
,因为后递增++
运算符的优先级高于取消引用运算符*
。 由于赋值是最后计算的,因此分配的值是表达式的值,然后while
表达式检查真/假,即非零或零。
实际增量发生在计算其操作数后的某个时间点。 因此,在同一表达式中对同一变量使用 ++
或 --
运算符而不使用序列点会导致未定义的行为。
它是否将 *a 设置为 *b,然后检查值是否 != 0,然后递增指针?
它递增指针,尊重它们,分配值,表达式产生该值,即在分配 NULL 后,它将被评估为 false 并停止。
优先顺序
- ++
- *
- =
值运算符从右到左计算,其优先级(计算顺序(低于++
运算符(后递增(。
为了回答你的问题,
while (*a++ = *b++);
首先评估*b++
,然后评估*a++
。由于这是后增量,因此 *a
的上一个值将获得*b
的上一个值。最后,表达式被转换为布尔值,如果b
没有指向空地址,则表达式的计算结果为 true,否则为 false。
它相当于这个:
while (*a = *b) {
++a, ++b;
}