• 《C/C++专项练习》— (1)


    前言

    每每到了一周之计的Monday啊,精神总是不佳,写篇博客提提神儿吧~
    继上次完成《C/C++工程师综合练习卷》后,有事儿没事儿就想刷几道题,赶脚不错,巩固了不少基础知识呢,要坚持哦~

    C/C++专项练习(1)

    完成时间:2015-06-06 21:49
    题目总量:10
    做题时间:20m
    正确率:8
    C/C++专项有好多百道题目呢,是巩固编程语言基础的好去处。
    专项练习考察的都是程序设计内的细节问题,其中很多C逻辑运算的题目、求代码段输出结果的题目、C++面向对象题目等等。

    错题分析总结

    1 . 下列代码编译时会产生错误的是()

    #include <iostream>
    using namespace std;
    struct Foo {
        Foo() {}
        Foo(int) {}
        void fun() {}
    };
    int main(void) {
        Foo a(10); //语句1  
        a.fun(); //语句2  
        Foo b(); //语句3  
        b.fun(); //语句4  
        return 0;
        16.
    }

    A. 语句1
    B. 语句2
    C. 语句3
    D. 语句4

    分析:这道题目考察的是结构体,代码段中定义了结构体类型Foo,其中包含了2个Foo的构造函数,以及一个foo()的普通函数。
    在main中,语句1 定义了一个名为a的Foo对象,它将调用Foo(int ){} 这一构造函数,正确;
    语句2中,使用对象a调用结构体成员函数fun(),没有问题;
    语句3中,这是这一题目的关键所在,乍一看,貌似定义了一个名为b的结构体对象,但是仔细斟酌下,哪有这种形式定义对象呢?这好像是一个函数的声明形式,返回值为Foo对象,函数名为b,但是main函数内部还可以声明函数吗?查阅资料发现,还真的是可以,这牵涉的是作用域的问题,在不同的地方声明,那作用域也就不同,那么在main里边声明也就只能在main函数里起作用(函数内声明叫局部声明,反之在函数外部声明就叫全局声明)。所以说这一条语句也是没有问题的。
    语句4中,既然语句3没有问题,是一个局部函数的声明,那也就不存在名为b的Foo对象了,所以该语句一定会编译出错!

    答案:D

    总结:错选C,知识面存储不够

    3 . 下面程序的输出结果是()

    char *p1= “123”, *p2 = “ABC”, str50]= "xyz";
    strcpy(str+2,strcat(p1,p2));
    cout << str;

    A. xyz123ABC
    B. z123ABC
    C. xy123ABC
    D. 出错

    分析: 这道题目考察的并不是你的字符串连接、复制的处理能力,而是你知不知道char *定义字符串常量。题目中定义的p1 和 p2 均是字符串常量,是只读的,所以答案就很显然了。
    关于字符串常量与变量的问题,介绍如下:
    从一般实现方式来看:
    char s[]=”abcd”;——s为局部变量(自动变量或寄存器变量)时具有自动存储期,放在运行期内存的栈中;s为全局或局部静态变量时具有静态存储期,放在内存的静态区;字符串字面量”abcd”具有静态存储期,放在文字常量区。这里,对象”abcd”作为一个右值用来初始化对象s,两者不是同一回事。
    char* s = “abcd”;(这种用法在C++中为deprecated,应使用const char* s = “abcd”;代替)——按指针引用s和“abcd”和”abcd”时视为引用同一个对象(作为一元&和sizeof的操作数等左值语义上下文中时则不同),一般放在文字常量区。
    文字常量区是只读的,而且更改字面量本身语义是不明确的,因此C++把字符串字面量视为字符串常量,禁止通过指针更改字面量本身。但是基于为了兼容旧代码等原因,ISO C标准中,更改字符串字面量的行为是未定义的,尽管具体的编译器可能把字符串字面量作为常量处理。

    答案:D

    总结:错选C, 看到题目,想都没想就傻傻的算起来了,不仅浪费了时间,还做错了题目!

    精题收藏

    5 . 下列代码的输出为:

    #include<iostream>
    #include<vector>
    using namespace std;
    
    int main(void)
    {
        vector<int>array;
        array.push_back(100);
        array.push_back(300);
        array.push_back(300);
        array.push_back(500);
        vector<int>::iterator itor;
        for (itor = array.begin(); itor != array.end(); itor++)
        {
            if (*itor == 300)
            {
                itor = array.erase(itor);
            }
        }
        for (itor = array.begin(); itor != array.end(); itor++)
        {
            cout << *itor << " ";
        }
        return 0;
    }

    A. 100 300 300 500
    B. 100 300 500
    C. 100 500
    D. 程序错误

    分析:考查C++标准库中的容器vector,vector 的erase函数 删除指定位置的元素时, 返回值是一个迭代器,指向删除元素下一个元素。删除第一个300后,itor指向其后的300,然后执行itor++,指向了500。

    9 .在80X86架构下,输出什么值?

    union Test
     {
        char a[4];
        short b;
     };
     Test test;
     test.a[0]=256;
     test.a[1]=255;
     test.a[2]=254;
     test.a[3]=253;
     printf("%d
    ",test.b);

    A. -128
    B. -256
    C. 128
    D. 256

    分析:首先要知道大小端模式,80X86下是小端模式;当然可以编写下测试就可以了,short占2个字节,设左高地址,右低地址;
    a[1] a[0]
    1111 1111 0000 0000
    short占用的是这a[1]、a[0]两个字节,最高位是1是一个负数,在计算机中采用补码表示,那么二进制表示为:1000 0001 0000 0000,转化为十进制就是-256。

    10 . 在32位机器中,如下代码的输出是?

    void example(char acWelcome[]){
        printf("%d",sizeof(acWelcome));
        return;
    }
    void main(){
        char acWelcome[]="Welcome to Huawei Test";
        example(acWelcome);
        return;
    }

    A. 0
    B. 4
    C. 23
    D. 24

    分析: 此题考查sizeof()的使用,注意与strlen的区别。参考sizeof的百科知识

  • 相关阅读:
    【转】C#字符串替换_无视大小写
    如何安装inf文件
    IDisposable模式
    VS2005 模板的制作方法
    ASP.NET Client Side State Management
    微软提供正确卸载IE7的方法并恢复IE6!!!!
    Access JavaScript variables on PostBack using ASP.NET Code
    Windows Mobile 5.0 SDK R2 for Pocket PC安装错误解决方案
    Oracle日期函数与应用
    XP下安装IIS6.0的办法
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214950.html
Copyright © 2020-2023  润新知