for循环在C中产生意外结果

时间:2019-07-04 17:51:06

标签: c

我无法理解以下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

3 个答案:

答案 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'。这是一个错误的值,因此它不会再次运行循环。