踩坑记录

Unity面试和总结分析(三)——几个简单却容易被忽视的坑

2018-11-03  本文已影响0人  达也酱

有人说编程就是一个踩坑的过程,踩过的坑越多,会的就越多,能力也会越来越完善,我觉得是有一定道理的。
在这段时间的面试里,就遇到了一些很低级却可能注意不到的坑,以下用面试题的形式逐题来分析一下。
注意,在这种题目中,不要在意语法问题,多数情况可能会使用伪代码编写。


1.unit类型的使用

有如下一段代码,运行后会发生什么:
    for(uint i=10;i>=0;i--)
        Debug.Log(i.ToString()); 
      uint i = 0;
      i--;
      Console.WriteLine(i.ToString());//输出 4294967295

再回到最初的循环,这个循环的进入条件是i>=0,对于一个uint型值而言,它永远是大于等于0的,这就意味着这是一个死循环,而这也就是这两行代码存在的问题了。


2.使用列表时对列表进行修改

有如下一段代码,运行后会发生什么:
  for(int i=0;i<actor.length;i++) 
      if(actor[i].blood==0)
          actor.Remove(i);
  for(int i=0;i<actor.length;i++) 
      if(actor[i].blood==0)
        {
              actor.Remove(i);
              i--;//对下标进行修正
         }


3.float值使用==符号

有如下一段代码,它存在什么问题:
  float time=0.0f;
  void PrintTime(float dr)
  {
    if((time-dr)==0.0f)
        Console.Log(time.ToString());
  }

浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到
——百度百科

所谓浮点数就是小数点在逻辑上是不固定的,而定点数只能表示小数点固定的数值,具用浮点数或定点数表示某哪一种数要看用户赋予了这个数的意义是什么。
——百度百科

一个浮点数a由两个数m和e来表示:a = m × b^e。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。

总之,float型的数值并不是一个准确的值,它的值是根据使用a = m × b^e的格式来表示的,根据精度不同,表示的值的精确度也不同,如果使用==符号,根据drtime当前的值,必然导致它们的差很可能不等于0.0f

        float time = 0.0f;
        void PrintTime(float dr)
        {
            if (IsEqual(time, dr))//使用定义的规则进行判断
                Console.Log(time.ToString());
        }

        const float precision = 0.0001f;//定义所需精度
        bool IsEqual(float a, float b)//定义判断方法
        {
            return a > b ? a - b < precision : b - a < precision;
        }

4.类型大小问题

Q:在32位系统中,sizeof(int)和sizeof(int*)的值分别是多少?


以上四个是就在这段时间面试里遇到的几个小坑,在这之前从未踩过,暂做一下记录。

上一篇 下一篇

猜你喜欢

热点阅读