2.长川科技

1. 数组str[10] sizeof(str)和strlen(str)

    char *str1="absdhfghfe";
    char str2[]="absde";
    char str3[8]={'a'};
    char ss[] = "0123456789";

    cout<<"str1  "<<sizeof(str1)<<endl;
    cout<<"str2 "<< sizeof(str2)<<endl;
    cout<<"str2 "<<sizeof(str3)<<endl;
    cout<<"str2 "<<sizeof(ss)<<endl;

运行结果
首先说明一点,char类型占一个字节,所以sizeof(char)是1,这点要理解。
str1是一个指针,只是指向了字符串“absde”而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节
str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串”absde”占的总空间。”absde”中,共有a b s d e \0六个字符,所以str2数组的长度是6,所以sizeof(str2)=6*sizeof(char)=6
str3已经定义成了长度是8的数组,所以sizeof(str3)为8
str4和str2类似,’0’ ‘1’ … ‘9’加上’\0’共11个字符,所以ss占的空间是11.
总之,对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清,而且char*=”aaa”的写法现在不被提倡,应予以避免
strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的

2. static的作用

1) 全局静态变量
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
a.内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
b.初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
c.作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。
好处:
定义全局静态变量的好处:
(1)不会被其他文件所访问,修改
(2)其他文件中可以使用相同名字的变量,不会发生冲突。
2).局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
a)内存中的位置:静态存储区
b)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
c)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

 注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

3). 静态函数
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
定义静态函数的好处:
(1)其他文件中可以定义相同名字的函数,不会发生冲突
(2)静态函数不能被其他文件所用。 存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。 auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。
关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。
*特点: static局部变量的”记忆性”与生存期的”全局性”
所谓”记忆性”是指在两次函数调用时, 在第二次调用进入时, 能保持第一次调用退出时的值.*

3.分别给出bool、int、float和指针变量这四种变量类型与零值比较的if语句。

  解答:

   BOOL 型变量:if(!var)
   int 型变量: if(var==0)
   float 型变量:
   const float EPSINON = 0.00001;
   if ((x >= - EPSINON) && (x <= EPSINON)
   指针变量:  if(var==NULL)
  剖析:
  考查对 0 值判断的“内功”,BOOL 型变量的 0 判断完全可以
写成 if(var==0),而 int 型变量也可以写成 if(!var),指针变量
的判断也可以写成 if(!var),上述写法虽然程序都能正确运行,
但是未能清晰地表达程序的意思。
   一般的,如果想让 if 判断一个变量的“真”、“假”,应直
接使用 if(var)、 if(!var),表明其为“逻辑”判断;如果用 if 判
断一个数值型变 量(short、int、long 等),应该用 if(var==0),
表 明 是 与 0 进 行 “ 数 值 ” 上 的 比 较 ; 而 判 断 指 针 则 适 宜 用
if(var==NULL), 这是一种很好的编程习惯。
  *浮点型变量并不精确,所以不可将 float 变量用“==”或“!
=”与数字比较*,应该设法转化成“>=”或“<=”形式。如果写成
if (x == 0.0),则判为错,得 0 分。


    浮点数在内存中的存贮机制和整型数不同,有***舍入误差***,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。 
    所以浮点数在运算过成功运算通常伴随着因为无法精确表示而进行的近似或舍入。但是这种设计的好处是可以在固定的长度上存储更大范围的数。 
    例如,一个指数范围为±4的4位十进制浮点数可以用来表示43210,4.321或0.0004321,但是没有足够的精度来表示432.123和43212.3(必须近似为432.1和43210)。当然,实际使用的位数通常远大于4。 

所以浮点数不能够判断相等,像 if(x==0)的这样的编码是不总是正确的,我们在判断浮点数相等时,推荐用范围来确定,若x在某一范围内,我们就认为相等,至于范围怎么定义,要看实际情况而已了,float,和double 各有不同
所以const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON) 这样判断是可取的
至于为什么取0.00001,可以自己按实际情况定义

4. 用递归判断数组a[n]是否为递增数组

bool judge(int p[],int n)
{
   if(n==1)
    return true;
   else
   {
       if(p[n-1]>p[n-2])
    {
        return judge(p,n-1);
    }
    else 
     return false;
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值