c - 我不明白这个循环中的 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 条件。
解决方案
该循环旨在查找字符串的中间部分。
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* z
为char *z
而不是char* z
. C 语法*z
作为声明符绑定在一起,与类型说明符 分开char
。请注意语法中的这一点:因为char* z, y
is char *z, y
,所以它声明y
为char
,而不是char*
。
推荐阅读
- javascript - 如何在不调整宽度的情况下在 li 文本中应用自动换行?
- python - 您如何遍历通过函数传递的参数列表?
- swift - SwiftUI Widget iOS 14 渐变问题
- reactjs - 分页在我的 React 管理员列表上不起作用?
- flutter - Flutter 驱动测试资源管理器
- javascript - 防止 RegEx 模式在组的开头选择“-”
- spring-boot - 休眠 - 方言已配置但仍然出现错误
- spring-data-ldap - “in”查询的 Spring-Data-LDAP 替代方案
- asp.net-core - Asp.Net Core - 多个同名不同参数的动作方法
- postgresql - 将日期附加到 Proc 中的表名