==运算符即使条件为true也会跳过条件if语句

时间:2018-07-29 17:35:51

标签: c windows

尝试为下面的程序编写程序
所以这里 输入将为aaabbbccc

输出将为abc

#include<stdio.h>
int main()
{
    char arr[10]={'0'};
    char ch;
    printf("enter input characters: ");

    for(int i=0;i<10;i++){
        ch=getchar();
        if(arr[i]=='0')//skips here even though the array element has'0' 
       //in it.
            arr[i]=ch;
    }
    for(int i=0;i<10;i++){
        if(arr[i]!='0')
            printf("%c",arr[i]);
}
        return 0;

}

2 个答案:

答案 0 :(得分:1)

使用

char arr[10]={'0'};

您只能将 first 元素初始化为'0',所有其余元素都初始化为0(即整数值零,而不是字符'0' )。当然,这意味着除了i == 0时以外,条件arr[i] == '0'将为 false

如果您希望所有元素都是字符'0',则需要显式初始化所有元素。

答案 1 :(得分:1)

根据C标准:

第6.7.8.21节:

  

如果用大括号括起来的列表中的初始化程序少于元素或成员   用来初始化已知数组的字符串文字中的总计或更少的字符   大于数组中元素的大小,则其余部分应为   初始化与具有静态存储持续时间的对象相同。

第6.7.8.10节:

  

如果具有自动存储持续时间的对象未初始化   显然,它的值是不确定的。如果对象具有静态   存储期限未明确初始化,则:

     

-如果具有指针类型,则将其初始化为空指针;

     

-如果具有算术类型,则将其初始化为(正数或无符号)零;

     

-如果是聚合,则每个成员都将被初始化(递归)   根据这些规则;

     

-如果是isunion,则第一个命名成员被初始化(递归)   根据这些规则。

强调我的。

char是C语言中的数字类型,因此,如果您仅将第一个数组元素显式初始化为字符'0'(顺便说一下,它没有数字值{{1} }),其余的将具有数字值0,比较值0将为false。