C++基础错题

1:以下代码最后一次打印结果是()

void fun(int iinputnum)
{
    static int icount=1;
    icount=icount+iinputnum;
    printf( “ \n icount =%d ” ,icount+iinputnum);
} 

最后输出 iCount = 6

解析:
静态局部变量的特点:1. 该变量在全局数据区分配内存;2. 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的 函数调用 不再进行初始化;3. 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0。

调用fun(1),icount = 2 输出icount = 3
调用fun(2),icount = 2+2 = 4,输出icount = 4+2 = 6

2:二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为()。

解析:设每行元素个数为n
[9][9] - [4][4] = n-4+9+4n = 5n+5 -> n =43
[7][7] - [4][4] = n-4+2n+7 = 3n+3 = 132
则地址为 Oxf8b82140 0x84 = 为Oxf8b821c4

3:

int main(int argc, char **argv)
{
    int a[4] = {
  1, 2, 3, 4};
    int *ptr = (int *)(&a + 1);
    printf("%d", *(ptr - 1));
}

解析:
&a是数组指针,其类型为int()[4],&a数组指针,a是数组首地址,则(a+1)代表从a数组首地址跳跃一个int的长度,(&a+1)表示从数组首地址跳跃一个数组的长度,而(a+1)只是跳跃1个int的长度,所以(&a+1)表示a[4],ptr为int类型,则*(ptr-1)= a[3] = 4

4:以下代码有什么问题?

struct Test
 {
     Test( int ) {}
     Test() {}
     void fun() {}
 };
 void main( void )
 {
     Test a(1);
     a.fun();
     Test b();
     b.fun();
 }

解析:Test b()是错误的,并不会调用无参构造函数,因为要调用无参构造函数,必须申明为Test b

5:

int main()
{ 
    int i;
    for(i=0;i<3;i++)
    switch(i)
    {
        case 0:printf("%d",i);
        case 2:printf("%d",i);
        default:printf("%d",i);
    }
}

程序运行后输出结果是()。

解析:switch语句中没有加break会执行满足条件的和之后的所有条件,i=0 所以输出0,0,0,i=1 输出1,i=2输出2,2所以最后的输出序列为000122

6:
下面有关volatile说法正确的有?

A:当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值(对)

B:优化器在用到volatile变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份 (对)

C: volatile适用于多线程应用中被几个任务共享的变量

D:一个参数不可以既是const又是volatile(错)

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
对于一般变量:为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中。以后再取变量值时,就直接从寄存器中取值。

一个参数既可以是const也可以是volatile:一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。(简单点就是该程序代码不能试图去修改它,但不排除硬件方面修改了它,我们每次都得重新读取它的值。)
几个应用例子:
a. 并行设备的硬件寄存器(如:状态寄存器)。
b. 一个中断服务子程序中会访问到的非自动变量。(个人理解:中断服务子程序不能用缓存在寄存器中的值来判断事件,因为那个值可能被修改了,需要重新读取。所以一般需要把这种变量声明为volatile。)
c. 多线程应用中被几个任务共享的变量。

7:

char* getmemory(void)
{ 
    char p[]=”hello world”;
    return p;
}
void test(void)
{ 
    char *str=NULL;
    str=getmemory(); printf(str);
} 

请问运行Test 函数会有什么样的结果? (输出乱码)

解析:解析:返回“字符串常量的指针”和“返回数组名”的区别在于,一个返回静态数据区的地址,一个返回栈内存(动态数据区)的地址。

8:下面程序段的输出结果是

char *p1 = ”123”, *p2 = ”ABC”, str[
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值