c 循环完成时这是什么顺序


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然后递增ab,因为后递增++运算符的优先级高于取消引用运算符*。 由于赋值是最后计算的,因此分配的值是表达式的值,然后while表达式检查真/假,即非零或零。

实际增量发生在计算其操作数后的某个时间点。 因此,在同一表达式中对同一变量使用 ++-- 运算符而不使用序列点会导致未定义的行为。

它是否将 *a 设置为 *b,然后检查值是否 != 0,然后递增指针?

它递增指针,尊重它们,分配值,表达式产生该值,即在分配 NULL 后,它将被评估为 false 并停止。

优先顺序

  1. ++
  2. *
  3. =

值运算符从右到左计算,其优先级(计算顺序(低于++运算符(后递增(。

为了回答你的问题,

while (*a++ = *b++);

首先评估*b++,然后评估*a++。由于这是后增量,因此 *a 的上一个值将获得*b 的上一个值。最后,表达式被转换为布尔值,如果b没有指向空地址,则表达式的计算结果为 true,否则为 false。

它相当于这个:

while (*a = *b) {
    ++a, ++b;
}

最新更新