编程语言C/C++(二)

编程语言C/C++的一些基本概念(二)

(1)关于Linux下的输入/输出重定向:

在Linux中,每个打开的文件被赋予一个文件描述符(file descriptor),包括标准输入(stdin),标准输出(stdout)和标准错误输出(stderr),由0,1,2分别描述。

command &> file 表示将标准输出(stdout)和标准错误输出(stderr)重定向至指定的文件file中。
M >& N,M和N都是文件描述符,M在不指定的情况下默认是文件描述符1。
command > file 2>&1,是由两部分组成。首先command>file表示将标准输出(stdout)重定向到文件file中。接下来的2>&1表示将标准错误输出(stderr)输出到文件描述符1指定的位置,即标准输出(stdout)的位置,由于标准输出已经冲定向到文件file中,所以标准错误输出也会重定向到文件file中。
command 2> file 1> file,也可看成是由两部分组成。首先command 2> file,表示将标准错误输出(stderr)重定向到文件file中;1> file,表示将标准输出(stdout)重定向到文件file中。 最终的file中不会包含标准错误输出(stderr)的信息,因为会被之后的标准输出(stdout)覆盖。

(2)有关内联函数:

内联函数是使用inline关键字声明的函数,也成内嵌函数,它主要的作用是解决程序的运行效率。
使用内联函数的时候要注意:
1、inline只影响函数在源码文件里面的编译行为,所以inline放在函数声明的位置没有意义,甚至可能引起编译错误。
2、inline只是程序员给编译器的一个建议,是否将函数内联取决于编译器的判断。内联函数类似于宏,在编译期间就展开。而递归函数在执行过程中才知道要运行多少次,所以递归函数不会被作为内联函数。

(3)关于C++运算符重载

除了类属关系运算符”.“、成员指针运算符”*“、作用域运算符”::“、sizeof运算符和三目运算符”?:“以外,C++中的所有运算符都可以重载。

(4)关于指针数组、数组指针、函数指针:

int(p)[10]是一个数组指针,p是一个指针指向 int[10] 数组, int p[10], 是一个指针数组,p是一个数组,数组每个元素是个指向int型的指针;
**char p () : 是指针函数,函数;
char (p) ():是函数指针,指针。

一般我们想到的数组指针是随便来一个 int(*p)[10],然后又说每个元素是一个函数指针,那么我们随便来一个函数指针 int (*pf)(int *) 。然后把(p)[10]作为一个整体替代pf 即 int((*p)[10]))(int *);分析:判断一个复杂式子看最高优先级的,*p是一个指针,然后(*p)外面是[],所以是数组指针,(p)[10])描述完毕,然后再看外面int()(int )很明显,这是一个函数指针,所以这个数组中每个元素是函数指针,即声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int
另外int *(p)[10] 等价于 int ((*p)[10])

(5)关于全局变量引用

如果是已经定义过的内容就只能用extern,一个变量的声明和定义是不一样的!假如一个头文件里面有 int a = 0; 如果用头文件包含就会出错的!声明可以有多次但是定义只能有一次!

(6)因为虚函数本质上是通过类对象的虚表进行访问,而且类的成员函数除了虚函数,其他都不存储在类当中,因此类对象不存在的情况下,无法使用虚函数,其他函数都可以正常访问(前提是这些函数都没有存取类对象的成员变量)

(7)关于链表搜索

如果链表数据是无序的,则单向搜索与双向搜索平均速度相同;
如果链表是有序的,而要搜索的数据距离最小值(最大值)较近,这种情况下双向搜索平均速度更快。因此双向搜索更稳定,方差更小

(8)关于强连通图

1:强连通图的定义:
在有向图G中,如果对于每一对vi、vj,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。
2:分析:
可知当n个节点的图构成一个环,任意两点之间存在着回路,于是最小的边数为n;最大边数为n(n-1);

(9)静态数据成员是使用类名而不是对象名来调用 因为静态数据成员只与类有关而与具体对象无关

(10)字符串www.qq.com所有非空子串(两个子串如果内容相同则只算一个)个数是()

要求的是子串,从左到右一次截取, 10个字符的子串,1个; 9个字符的子串,2个; 8----------------------3 7----------------------4 … 1----------------------10 共有:1+2+3+…+10=10*(10+1)/2=55 减去重复的: 1个字符时有3个w,2个q,2个. 2个字符时有2个ww 故应减去:(2+1+1+1)=5 答案:55-5=50