zoukankan      html  css  js  c++  java
  • 《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的百科知识

  • 相关阅读:
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
    自考感悟,话谈备忘录模式
    [每日一题] OCP1z0-047 :2013-07-26 alter table set unused之后各种情况处理
    Java实现 蓝桥杯 算法提高 p1001
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 因式分解
    Java实现 蓝桥杯 算法提高 因式分解
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214950.html
Copyright © 2011-2022 走看看