Nowcoder专项练习:C++(五)

1,C语言的进制

对于题目:
C语言程序中的整数不能是什么进制的整数?

在C语言中,输入有三种:

  • %d:十进制
  • %o:八进制
  • %x:十六进制

唯独不能是二进制


2,fclose相关

对于问题:
重复多次 fclose 一个打开过一次的 FILE *fp 指针会有什么结果?

我们需要知道的是:

  • fclose是一个函数名,功能是关闭一个流。
  • 使用fclose()函数就可以把 缓冲区 内最后剩余的数据输出到内核缓冲区,并释放文件指针和有关的缓冲区。
  • 函数原型:int fclose( FILE *fp ).

因此,一次正常的fclose会争取释放FILE指针的相关内容。再次fclose释放已经释放掉了的FILE指针,所以会出错。


3,数组名作为指针

对于问题:
设有下面的程序段:

char s[]"china"char *p=s;

则p和s可以随意替换使用,这个说法是否正确?

这个说法是错误的

数组名作为指针是一个常量,不能和变量指针等同。


4,Java与C++

Java与C++的区别:

  1. Java是解释型语言,所谓的解释型语言,就是源码会先经过一次编译,成为中间码,中间码再被解释器解释成机器码。对于Java而言,中间码就是字节码(.class),而解释器在JVM中内置了。
  2. C++是编译型语言,所谓编译型语言,就是源码一次编译,直接在编译的过程中链接了,形成了机器码。
  3. C++比Java执行速度快,但是Java可以利用JVM跨平台。
  4. Java是纯面向对象的语言,所有代码(包括函数、变量)都必须在类中定义。而C++中还有面向过程的东西,比如是全局变量和全局函数。
  5. C++中有指针,Java中没有,但是有引用。
  6. C++支持多继承,Java中类都是单继承的。但是继承都有传递性,同时Java中的接口是多继承,类对接口的实现也是多实现。
  7. C++中,开发需要自己去管理内存,但是Java中JVM有自己的GC机制,虽然有自己的GC机制,但是也会出现OOM和内存泄漏的问题。C++中有析构函数,Java中Object的finalize方法
  8. C++运算符可以重载,但是Java中不可以。同时C++中支持强制自动转型,Java中不行,会出现ClassCastException(类型不匹配)。

5,指针的运算符

对于类型相同的指针变量而言,可以使用的运算符为:

  • -
  • =
  • ==
  • 等等

但是,两个类型相同的指针变量不可以相加,即不能使用 +

  1. 所有的有效指针都是一个正整数(0可以被用来定义无效指针,小于0的只能叫非法指针),这个值代表了内存中的某个地址,内存可以理解为一把尺子,上面的刻度就是内存的地址,最小刻度一毫米可以理解为那就是一个字节)。指针的类型定义只是指明了他指向的那个地址段是保存的什么样的数据而已,假设是一个4字节的数据,那么指针的值只是表示开始位置,后面连续的4个字节或刻度的地方,都用来放这个数据。
  2. 两个类型相同的指针相加毫无意义,而且有可能越界。 比如p1和p2都是类型为int的指针,虽然他们指向的内存中保存了两个int数N1和N2,但是这两个数在内存中可能挨着,也可以能间隔很远,甚至有可能是一个地方。假设p1值也就是N1位置起始值为1234,P2为2345,这个时候如果直接相加得到的数据3589有可能已经超出了内存最大值或者指向某个无意义的内存地址,所以指针相加没有意义可言。正确的应该是N1和N2相加才是合理的算数运算。
  3. 指针可以相减,可以和立即数加或减,是有意义的,是允许的。 比如我想知道N1和N2之间到底间隔了多少字节的内存,两者相减就相当于尺子上两个刻度相减,也就是长度或者宽度了。另外,和立即数的加减主要用来快速寻址,比如我有一个数组,起始指针为P0,如果数组保存的是一系列INT值,那么 P0+2*sizeof(int)得到的值就是第三个元素的所在位置的地址,也是一个指针,是有意义的(因为不同的语言和系统,int值每次所占的字节数可能不一致,所以使用sizeof函数去求得而不是直接加常规的4)。
  4. 指针不仅可以指向简单数据,也可以指向复杂的数据块或者组合的类型,总之一个类型的指针的值所表示的意义就是这种类型的数据在内存中说占的位置的起点,这只是一个刻度,具体占多宽要根据具体类型来定。指针的操作最容易犯的错误就是:越界、非法指针、指向的数据不是想要的起始位置而是中间位置、指针的值和其指向的值分不清这些。

举例来说,好比你数学考50分,把你同学考60,你们相减是你们的差距,指针是移动地址,你们相加指的是什么呢?

参考地址:
两个相同的指针变量能不能相加!为什么?


6,编译原理问题

编译的过程分成6步:

  1. 扫描(词法分析)
  2. 语法分析
  3. 语义分析
  4. 源代码游湖
  5. 代码生成
  6. 目标代码优化

词法分析是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符、将他们组成词素( 源程序中的一个字符序列,它和某个词法单元的模式匹配,并被词法分析器识别为该词法单元的一个实例 ),生成并输出一个词法单元序列,每个词法单元对应一个词素。这个词法单元序列被输出到语法分析器进行语法分析。

词法分析器用于识别单词


7, switch的操作

在switch语句中,只要没有遇到break,则这个case下面所有的case都会执行。

对于题目:

#include <iostream.h>
void main() {
    int x=3,y=3;
    switch(x%2) {
        case 1:
            switch (y) {
        case 0:cout<<"first";
        case 1:cout<<"second";break;
        default: cout<<"hello";
    }
    case 2:cout<<"third";
    }
}

最后的输出为:

hellothird


8,template

函数模板的声明形式:

template<typename 数据类型参数标识符>
<返回类型><函数名>(参数表)
{
    函数体
}

对于问题:
sort的template的正确写法应该为:

template<class Aclass B> void sort(A first,A last,B pred)

9,类模板对象的实例化

建立类模板的对象时,首先需要将类模板实例化,即想模板传递参数完成类模板的实例化,然后在定义该类的对象。模板函数只有在使用时候才会进行实例化。

因此,建立类模板对象的实例化过程为:

  • 模板类->对象

10,重载运算符

类中重载运算符的一般格式是:

类名  operator  运算符(参数)

对于题目:
若要对data类中重载的加法运算符成员函数进行声明,则写法应该是:

Data operator+(Data);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值