我无法理解以下for循环。请帮我。谢谢你的时间。我无法理解for循环在第一次迭代中如何变为真。如果s [0] =“ d”,那么如何将“ d”视为“ true”。
#include <stdio.h>
int main()
{
char s[] = "d";
int i;
for(i = 0; s[i]; i++)
printf("%c %c %c %c",s[ i ], *(s+i), *(i+s), i[s]);
return 0;
}
output : dddd
答案 0 :(得分:1)
根据C标准(6.5.2.1数组下标)
2后缀表达式,后跟方括号[] 是数组对象元素的下标名称。的 下标运算符[]的定义是E1 [E2]相同 到(*((E1)+(E2))))。由于适用于 二进制+运算符,如果E1是一个数组对象(等效于指向 数组对象的初始元素),并且E2是整数,E1 [E2] 指定E1的第E2个元素(从零开始计数)。
因此,s[i]
等同于*( s + i )
,从数学的观点来看,它等同于*( i + s )
,并且在C语言中可以像i[s]
那样重写,因为无论如何表达式被认为像*( i + s )
。
所有这些构造
s[ i ]
*(s+i)
*(i+s)
i[s]
在C中等效,表示数组i-th
的{{1}}元素。
关于您对我的回答的评论
能否请您解释一下for循环在 初始迭代?
然后用字符串常量s
初始化数组s
。
"d"
字符串文字本身包含终止零字符char s[ ] = "d";
。因此,上面的声明实际上可以用以下方式等效地重写
'\0'
由于数组的第一个元素不等于零(它等于字符char s[ ] = { 'd', '\0' };
),则当条件'd'
等于条件s[i]
时为真s[i] != 0
等于i
。
以及有关for陈述的引用(6.8.5迭代语句)
4 迭代语句使称为循环体的语句 重复执行直到控制表达式比较相等 设为0 。无论循环主体是否为 从迭代语句输入或通过跳转输入。1
答案 1 :(得分:1)
char s[] = "d";
声明一个字符串文字,该文字以零结尾。在您的for循环中,中断条件为s[i]
,这意味着它将一直运行直到到达NULL字符(将是第二个字符)为止。
答案 2 :(得分:1)
char s[] = "d"
将s
初始化为包含字符'd'
和后跟空终止符('\0'
)的数组。
在for循环的初始迭代中,我们检查s[0]
以确定是否运行循环。这将检查s
的第一个字符'd'
。在C语言中,除'\0'
以外的任何字符均被视为True,而'\0'
被视为false。 (这是因为C处理类似于整数的字符,其中0为false,其他int为true。)
因此for循环最初会检查'd'
(这是一个真值)并运行循环。
在第二次迭代中,它查看s[1]
,即'\0'
。这是一个错误的值,因此它不会再次运行循环。