回 帖 发 新 帖 刷新版面

主题:数组问题

#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
  char a[]="abcdabcabdaeff";
  int b[5]={0},i=0;
  while(a[i++])
  {
    switch(a[i])
    {
      case'a':b[0]++;break;
      case'b':b[1]++;break;
      case'c':b[2]++;break;
      case'd':b[3]++;break;
      dafault:b[4]++;
    }
   
   }
   for(i=0;i<5;i++) cout<<b[i]<<' ';
   cout<<endl;
}
我算出来是33223,可答案是33220,另外,我在Dev-C++ 5中编译通过,可什么都没有输出,这是怎么回事?

回复列表 (共6个回复)

沙发

int b[5]={0}
这样初始化是不对的,它只能初始化第一个元素。。。

板凳

[quote]int b[5]={0}
这样初始化是不对的,它只能初始化第一个元素。。。[/quote]


他意思是把所有元素初始为0. 这样初始化完全可以,因为它在mian函数里面,后面的会自动补0,就算只写int b[5]; 这样也可以

3 楼


1、char a[]="abcdabcabdaeff";  

应该是:4(a) 3(b) 2(c) 2(d) 3(e+f)

2、while循环应改改:

[color=FF0000]while(a[i])[/color]{
    switch(a[i])
    {
      case'a':b[0]++;break;
      case'b':b[1]++;break;
      case'c':b[2]++;break;
      case'd':b[3]++;break;
      dafault:b[4]++;
    }
    [color=FF0000]i++;[/color] 
}

3、dafault:b[4]++;    //错了,是 [color=FF0000]default[/color]

4 楼


可能楼主要问的是 为什么原代码(可能是某种考试的题目)的结果是 33220。

原因就如 楼上指出的那样,有两点:
    1.  [code=c]
while(a[i++])
  {
    switch(a[i])[/code]
    2.  [code=c]
dafault:b[4]++; 
[/code]

  上面的第2点,用gcc编译成汇编代码,发现给出警告 
          标签 'dafault' 定义了但没有使用
  也就是说,根本不可能执行到这一条语句,因此b[4]等于0

  上面的第1点,使得程序跳过了第一个字符'a',因此b[0]等于4-1

5 楼

[quote][quote]int b[5]={0}
这样初始化是不对的,它只能初始化第一个元素。。。[/quote]


他意思是把所有元素初始为0. 这样初始化完全可以,因为它在mian函数里面,后面的会自动补0,就算只写int b[5]; 这样也可以[/quote]
static变量是可以初始化的。而局部变量是在栈中,它不会绝对性的恒为0(初始值)如果你说书本上告诉你的,我只能说:书上说的不对。

6 楼

int main()涵数加上return 0;
dafault-->default;
另外,正确输出为3 3 2 2 4

我来回复

您尚未登录,请登录后再回复。点此登录或注册