《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”, str[50]= "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\n",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的百科知识

时间: 2024-11-07 10:49:33

《C/C++专项练习》— (1)的相关文章

[c/c++] programming之路(17)、高级指针

一.二级指针 二级指针的作用:1.函数改变外部变量指针2.外挂改变一个指针的值 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main(){ 5 int a = 10; 6 int b = 20; 7 int *p1 = &a; 8 int *p2 = &b; 9 int **pp = &p1; 10 printf("%d,", **pp); 11 printf("\n%x,

C++学习笔记----2.4 C++引用在本质上是什么,它和指针到底有什么区别

从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调

【转】父类子类指针相互转换问题

1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的: 2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的: 3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的. 将上面三句话总结成一句话就是:当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数: 当父类子类有同名虚函数的时候呢,调用的是指针转换前指

C++ Primer 学习笔记与思考_7 void和void*指针的使用方法

(一)void的含义 void的字面意思是"无类型",void差点儿仅仅有"凝视"和限制程序的作用,由于从来没有人会定义一个void变量,让我们试着来定义: void a; 这行语句编译时会出错.提示"illegal use of type 'void'".只是.即使void a的编译不会出错.它也没有不论什么实际意义. void真正发挥的作用在于: (1) 对函数返回的限定: (2) 对函数參数的限定. int f(void); equal t

当this指针成为指向之类的基类指针时,也能形成多态

this指针: 1)对象中没有函数,只有成员变量 2)对象调用函数,通过this指针告诉函数是哪个对象自己谁. 1 #include<iostream> 2 using namespace std; 3 class Shape 4 { 5 public: 6 //void cal_display(Shape* this) 7 void cal_display(){ 8 display(); 9 this->display(); 10 } 11 private: 12 virtual vo

指针x(超简单的x)

指针! 1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 /* 7 相加或者相乘 8 */ 9 10 int main() 11 { 12 int a,b,s,t; 13 cin>>a>>b; 14 int *p; 15 p=&a; 16 int *q; 17 q=&b; 18 s=(*p)+(*q); 19 t=(*p)*(*q); 20 printf(

二重指针实现排序

1 //双指针对十个数排序 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 #define N 8 6 //2017.3.5 7 int main() 8 { 9 //初始化数组 赋值N个数 用指针数组指向 10 int num[N]; 11 int *pNum[N]; 12 int **p = NULL; 13 for (int i = 0; i < N; i++) 14 { 15 num[i] = rand() % 100;/

c指针-专题

六---指针 内存和地址怎么理解呢? 机器中有一些位置,每一个位置被称为[字节]/byte,许多现代机器上,每个字节包含8个位.更大内存单位[字],通常包含2个或4个字节组成. 一个字包含4个字节,它的地址是什么? 他仍然只有一个地址,是最左边还是最右边的那个字节的位置,取决于机器. 机器事实-关于整型的起始位置: 在要求边界对齐(boundaryalignment)的机器上,整型存储的起始位置只能是某些特定的字节,通常是2或4的倍数. 变量名和地址关系? 所有高级语言的特性之一,就是通过名字而

智能指针的原理和简单实现

什么是智能指针? 智能指针实质上是一个类,定义一个类来封装资源的分配和释放.这个类的构造函数中传入一个指针,完成资源的分配和初始化.在析构函数中释放传入的该指针,完成资源的释放. 为什么要用智能指针? 智能指针就是智能,自动化的管理指针所指向的动态资源. 例如以下情况:代码中经常会忘记释放动态开辟的内存资源,导致内存泄露. // case1 void Test2() {  int* p1 = new int(2);  bool isEnd = true;  //...  if (isEnd)  

单继承与多继承中的虚函数表和虚函数指针

首先,我们了解一下何为单继承,何为多继承?? 单继承:一个子类只有一个直接父类. 多继承:一个子类有两个或多个直接父类. 单继承中的虚函数表分析: 示例程序: #include <iostream> using namespace std; typedef void(*FUNC)(); class Base { public: virtual void func1() { cout << "Base::func1()" << endl; } virt