#include<stdio.h>
#include<stdlib.h>
int main()
{int id=0;
int ceshi=2;
char a[20]={'a','baaa','c'};
for(int num;num<20;num++)
{ if(a[num='\0'])
break;
id++;}
printf("%d",id);
system("pause");
return 0;}
这是我写的一段程序,我由两个疑问。
第一呢,我声明了字符数组a[20]。我觉得每个元素只能是一个字符,但是把baaa写在一起,编译器也不会报错,这个令我觉得奇怪,为什么会这样呢?
第二呢,if 后面接的是a[num='\0'],这是一个数组,不是一个true类型或者false类型的判断条件,这么做的话,什么时候执行if下面包含的语句,是未知的。
这两个问题都是编译器的错误吗?
我这么写:
char a[20]={'ab','2'};
编译器不会报错,但会给出警告:minGW编译器
\test18\main.cpp:12:25: warning: narrowing conversion of '24930' from 'int' to 'char' inside { } is ill-formed in C++11 [-Wnarrowing]
char a[20]={'ab','2'};
警告:在c++ 11中,将'24930'从'int'转换为'char'是病态的
其中24930是a<<8 | b; 说明编译器把它转成int型了。char实质也是int,只是它用字符形式表现出来。
你第二个问题,跟你上一个问题其实是同一个问题,你仔细想就明白了,a[num='\0'];其实就是
num='\0';
a[num];<=> a['\0']; 这样就回到你上一个问题b['\0'] == 97问题。
而你这里也是a[0] 为 a,也就是97。
然而 if(97) 会永远为真(非0的数字都是真)。true/false其实也是数字,1/0.
个人建议:要学会举一反三思维。多思考一下就能明白了,不明白就上机调试,这样学的更快些。
还有什么问题可以在这里继续问。