weitom1982

向各位技术前辈学习,学习再学习.
posts - 299, comments - 79, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

变量初始化的一个例子

Posted on 2006-03-20 23:33 高山流水 阅读(159) 评论(0)  编辑 收藏 引用 所属分类: 程序语言

今天在做一道华为面试题目时候,就是因为没有将变量初始化,而导致我用了一节课的时间调试:)

题目是:找出01字符串中0和1出现的最大次数.

代码:

#include < iostream >
#include
< string >
using   namespace  std;
void  main()
{
    
char   * a = " 010000010111101101000000000 " ;
    
int  i,temp0 = 0 ,temp1 = 0 ,max0 = 0 ,max1 = 0 ; // 对变量初始化,如果不初始化,变量值是随机的
     for (i = 0 ;i < strlen(a);i ++ )
    
{
        
switch (a[i])
        
{
            
case   ' 0 ' :
            
{
                temp0
++ ;
                
if (a[i + 1 ] == ' 1 ' || i == strlen(a) - 1 )
                
{
                    
if (max0 < temp0) max0 = temp0;
                    temp0
= 0 ;
                }

                
break ;
            }

            
case   ' 1 ' :
            
{
                temp1
++ ;
                
if (a[i + 1 ] == ' 0 ' || i == strlen(a) - 1 )
                
{
                    
if (max1 < temp1) max1 = temp1;
                    temp1
= 0 ;
                }

                
break ;
            }

        }

    }

    cout
<< " max0= " << max0 << endl;
    cout
<< " max1= " << max1 << endl;
}


那为什么不对i初始化呢?因为尽管i没被初始化,它的初始值是随机的,但在循环参数表里面已经对他进行赋值,所以i的随机值已经被0覆盖。

posted on 2005-11-22 00:40 阅读(199) 评论(9)  编辑 收藏收藏至365Key 所属分类: C++之梦

FeedBack:
# re: 变量初始化的重要性!
2005-11-22 10:10 | 沐枫网志
#include <iostream>
void main()
{
char *a="010000010111101101000000000";
int max[2] = {0, 0};
int count[2] = {0, 0};

while(*a)
{
int index = *a - '0';
count[index] ++;
count[index^1] = 0; // count[index?0:1] = 0; // count[index==0?1:0] = 0;
if(count[index] > max[index])
max[index] = count[index];
a++;
}
std::cout << "max 0: " << max[0] << std::endl;
std::cout << "max 1: " << max[1] << std::endl;
}

// output
// max 0: 9
// max 1: 4

点评:
1. 就C字串来说,从头到尾的遍历不需要for,用while是最佳选择。
2. strlen是很浪费的操作,如果非要用,对同一个不变长度的字串来说,用一个变量来存储,然后重复使用,比重复计算strlen要好得多。
3. 对数字串来说,可以直接将字符减去'0'得到相应的数字。
4. 比较判断其实并不比赋值省时,有时候直接赋值,比起比较后再赋值可能更有效率。更何况你的判断条件达三条之多才决定是否需要赋值。
所以if(a[i+1]=='0'/*或'1'*/||i==strlen(a)-1)可以省掉。
5. 利用数组的下标,会给你带来意想不到的简洁。

6. 最后,变量没有初始化,是算法设计的问题。如果初始条件都没有确定,只能说明你的算法没有想清楚。  回复
  
# re: 变量初始化的重要性!
2005-11-22 13:02 |
非常感谢网志兄的点评,又学到东西啦!
这六条评论真是受益匪浅啊!
谢谢:)  回复
  
# re: 变量初始化的重要性!
2005-11-22 13:06 |
count[index^1] = 0; // count[index?0:1] = 0; // count[index==0?1:0] = 0;

这一行不懂。。。能否解释一下,谢谢:)  回复
  
# re: 变量初始化的重要性!
2005-11-22 13:09 |
查了一下^是按位移或,不过我对位操作一窍不通。。。。。。。。  回复
  
# re: 变量初始化的重要性!
2005-11-22 13:29 | 可冰
count[index^1] = 0; // count[index?0:1] = 0; // count[index==0?1:0] = 0;
//===========================
觉得不如下面这个可读性好或简洁:
count[ ! index ] = 0;

个人意见哈^-^  回复
  
# re: 变量初始化的重要性!
2005-11-22 13:35 | 沐枫网志
意思是,这三条都可以。你可以选一条你认为能够理解的就可以了。
我建议用
count[index==0? 1 : 0] = 0;

至于可冰的count[!index] = 0;我觉得不好。!是表示逻辑非的操作,用在此处会让人误会,代码不好读。  回复
  
# re: 变量初始化的重要性!
2005-11-22 21:10 |
呵呵,我明白啦,感谢大家啊!  回复
  
# re: 变量初始化的重要性!
2005-11-28 11:16 | 很土
变量随定义随初始化,随时的错误检查,这些都是c/c++编程必须要养成的"习惯".有无数的错误和这两个有关.  
只有注册用户登录后才能发表评论。