首页 > 解决方案 > 我不明白这个循环中的 while 语句(C 中的指针)

问题描述

#include <stdio.h>

char* g(char* s) {
    char* z = s;
    while(*z++ && *z++) s++;
    return s;
}

int main() {
    char s[6];
    s[0] = 'a';
    s[1] = 'b';
    s[2] = 'c';
    s[3] = 'd';
    s[4] = 'e';
    s[5] = 'f';
    //s[6] = 'g';    
    printf("%s\n",g(s));
    return 0;
}

此代码将输出一个字符串“def”,但我不知道如何解释上面的 while 条件。

标签: cpointerswhile-loop

解决方案


该循环旨在查找字符串的中间部分。

char* z = s;初始化z为指向字符串的第一个字符。1

该代码while (*z++ && *z++)查找两个非空字符:

  • *z产生z指向的字符。++前进z以指向下一个字符。当*z用作&&操作中的条件时,如果值不为零,则为“真”,如果值为零,则为“假”。
  • 因此,如果下一个字符不为零,则左侧*z++为真,然后&&继续计算右侧操作数 another *z++
  • 如果下一个字符也不为零,则 right*z++为真,while循环计算s++;语句。这提高s了一个位置。
  • 因此,对于每两个非零字符,s前进一个位置,而z前进两次,每个前进一次++
  • 当剩下的不是两个非零字符时,左边*z++或右边*z++都是“假”,并且s不前进。循环退出。

然后s返回,前移了字符串中字符数的一半,向下舍入。(所以,如果有六个字符,它已经前进了三个位置。如果有七个,它也前进了三个位置,并且指向中间的字符。)

正如评论中所指出的,不能依赖该程序来工作,因为它向函数传递了一个不包含空终止符的字符数组。要保存一个包含六个字符的字符串,main应将 in 中的数组定义为char s[7];,并且s[6]应设置为零。

脚注

1编译器解析char* zchar *z而不是char* z. C 语法*z作为声明符绑定在一起,与类型说明符 分开char。请注意语法中的这一点:因为char* z, yis char *z, y,所以它声明ychar,而不是char*


推荐阅读