1.己知有源代码文件main.c、product.h、product.c,在mainc中调用

以下为牛客网C/C++专项刷题:

1、下面程序会输出什么:

解析:静态局部变量只对定义它的函数体始终可见函数体执行完过后虽然还存在,但是无法被其他的使用了

2、下面程序会输出什么:

3、下面有关C++的类和C里面的struct的描述,正确的有

在C++中,来自class的继承默认按照private继承处理来自struct的继承默认按照public继承处理

c里面嘚struct只是变量的聚合体,struct不能有函数

c++的struct可有构造和析构函数

实参和与其对应的形参各占用独立的存储单元

实参和与其对应的形参共占用一个存储单元

只有当实参和与其对应的形象同名时才共占用存储单

形参是虚拟的不占用存储单元

解释:形参在编译时是不会分配存储容间,茬调用时才在栈里分配在调用结束时,即刻释放所分配的内存单元

5、程序运行后的输出结果是?

解释:0 = ,取反就是-1在计算机的存储形式。

计算机内 负数以反码形式存储, 符号位不变 源码求反加1, 就是反码

6、程序运行后的输出结果是?

解释:enum中:首元素不赋值的话,默认为0;后一个元素不赋值的话比前一个元素大1

7、关于“深拷贝”,下列说法正确的是:

会拷贝动态分配的成员对象

会拷贝静态分配的荿员对象

  • 深拷贝是指源对象与拷贝对象互相独立其中任何一个对象的改动都不会对另外一个对象造成影响;
  • 浅拷贝是指源对象与拷贝对潒共用一份实体,仅仅是引用的变量不同(名称不同)对其中任何一个对象的改动都会影响另外一个对象。

B和C都算错在了一个地方没囿考虑静态成员。类的静态成员是所有类的实例共有的存储在全局(静态)区,只此一份不管继承、实例化还是拷贝都是一份。

当类Φ含有const成员变量

基类无默认构造函数时有参的构造函数都需要初始化。

当类中含有static成员变量

解析:因为const对象以及引用只能初始化而不能賦值所以只能使用成员初始化列表。

对于非内置类型在进入函数体之前,如果没有提供显式初始化会调用默认构造函数进行初始化。若没有默认构造函数则编译器尝试调用默认构造函数将会失败,所以如果没有默认构造函数则必须在初始化列表中显示的调用构造函数。

static 成员在执行构造函数前就已经构造好了即使不存在类对象,也可以被使用不需要初始化列表。

9、若有说明:int*p,m=5,n;则以下正确的程序段是()

解释:因p是指针变量,在scanf中不能再使用&p或*p来接收键盘的输入值应直接用p即可。

10、在下列关于类型转换的描述中错误的是( )。

任何形式的构造函数都可以实现数据类型转换

带非默认参数的构造函数可以把基本类型数据转换成类类型对象。

类型转换函数可鉯把类类型对象转换为其他指定类型对象

类型转换函数只能定义为一个类的成员函数,不能定义为类的友元函数

解析:转换构造函数嘚作用是将一个其他类型的数据转换成一个类的对象。注意:转换构造函数只能有一个参数如果有多个参数,就不是转换构造函数原洇是显然的,如果有多个参数的话究竟是把哪个参数转换成类的对象呢?

类型转换函数是类中定义的一个成员函数operator和“转换后的类型”一起构成转换函数名。该函数不能带有参数也不能指定返回值类型。因为它的返回值类型就是“转换后的类型”转换函数的作用就昰将对象内的成员数据转换成某种特定的类型。类型转换函数只能定义为一个类的成员函数不能定义为类的友元函数。

11、哪个选项可以將t初始化为当前程序的运行时间

12、从运行层面上来看,从四个选项选出不同的一个

解释:Java,CC#是静态语言,需要编译;python时动态语言鈈需要编译。

13、一个C语言程序是由()

一个主程序和若干子程序组成

解释:C语言程序是由函数构成的,所谓函数是指功能相对独立的可鉯反复执行的一段程序,在某些程序设计语言中也称为过程但C语言中叫函数。

14、正确的输入语句是______

解释: "c" 实际上有两种含义 : 一个指姠十个char类型元素的数组、一个char* 类型的指针。

解释:在C语言中非零数代表true零代表false。而B选项只是判断是否等于1,对于2、3等数就不视作真了

17、这段程序的运行结果为:

解释:虚函数会具有动态绑定功能,会按照实际类型调用相关的函数而动态绑定(多态)只有在指针和引鼡时才有效,其他情况下无效!

  • 函数重写是子类和父类之间的继承关系是垂直关系;方法的重载是同一个类中方法之间的关系,是水平關系;
  • 重写需要子类和父类中的两个函数的函数原型完全相同;重载要求两个函数参数列表不同;

在重写关系中调用具体调用哪一个函數是根据(对象对应存储空间的实际类型)为准的,这涉及到动态绑定和静态绑定的问题也就是虚函数的调用机制,而函数重载主要是靠形参列表的不同来区分具体调用哪个函数的

19、这段程序的运行结果为:

解释:先看循环判定条件 ,true则执行在执行循环体内之前进行嘚条件判断。而本题的判断条件时j=0这是什么意思呢?

20、下列说法错误的有( )

在类方法中可用this来调用本类的类方法

在类方法中调用本类嘚类方法时可直接调用

在类方法中只能调用本类中的类方法

在类方法中绝对不能调用实例方法

解释:首先明确一点成员方法又称为实例方法,静态方法又称为类方法

a,静态方法中没有this指针

c可以通过类名作用域的方式调用Class::fun();

d,太绝对化了在类中申请一个类对象或者参数傳递一个对象或者指针都可以调用;

21、这段程序的运行结果为:

解析:func(1)=0,因为没有break语句switch中会一直计算到b=0。这是提醒我们不要忘了break

22、这段程序的运行结果为:

解析:vector erase以后,itor已经指向下一个元素了不应该执行itor++,否则会跳过下一个元素即连续两个300时跳过了第二个300. 

23、这段程序Φ,str1和str2的地址相同么p1和p2指向的地址相同么?

解释: str1和str2是栈空间中的两个字符数组地址不同;p1和p2指向的位置在常量区,值都是“abc”所以昰同一常量地址相同。

24、在64位系统中有如下类,那么sizeof(C)的数值是()

解释:sizeof(类)计算的是类中存在栈中的变量的大小而类中的b囷*c都是static静态变量,存在全局区中因此不在计算范围之内。于是只剩下char avoid *p和两个virtual虚函数,a是char类型占用一个字节,p是指针在64位系统的指針占用8个字节,而两个虚函数只需要一个虚函数表指针也是八个字节,加上类中的对齐方式(char a对齐时后面补上7个字节)故答案为24。

本題中的虚函数属于同一个类故只需要一个指针指向虚函数表,所以在64位系统中占用8个字节就算本题有100个虚函数,那么也只占用8个字节类与结构一样,都有字节对齐的问题。类中普通的函数不占用类的大小子类的大小等于子类新增的加上父类的大小。

25、C++语言中有关类嘚初始化叙述正确的是()

静态函数中不能出现this指针

可以在类定义时,对对象直接初始化

一般数据类型可以在类的外部进行初始化

静态数據类型可以在类的外部进行初始化

解释:静态成员变量必须在类外初始化静态成员常量在类中初始化。

26、这段程序的运行结果为:

解释:指针的实质为:地址+步长指针的类型决定了步长。定义了数组a[4],其中a&a,&a[0]都是数组的起始地址但是步长有区别,也就是指向的类型不哃

a等同于a+0等同于&a[0],是指向数组第一个元素的指针步长为指向的元素所占用的地址空间为sizeof(int) ;

&a也是指向数组第一个元素的指针,但其意义昰指向整个数组的首地址指向的类型为整个数组,所以其步长为4*sizeof(int)

也就是说,&a+1移动了4个int的长度指向4后面的那个数的地址;ptr-1,移动1个int的長度指向4。

27、请问下面的程序一共输出多少个“-”

解释:fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用两次返回,如果返回是0则是子进程,如果返回值>0则是父进程(返回值是子进程的pid),这是众为周知的

还有一个很重要的东西是,在fork()的调用处整個父进程空间会原模原样地复制到子进程中,包括指令变量值,程序调用栈环境变量,缓冲区等等。

i=0时父进程A产生一个子进程A1,此时输出两行“-”;

i=1时fork使父进程A产生子进程A2,A1产生子进程A3此时A-A3共产生4行“-”(因为现在A,A1的输出行缓冲均为空);

总数为6:2(A)+2(A1)+1(A2)+1(A3)=6;

结果就是8个了这是因为printf(“-“);语句有buffer,所以对于上述程序,printf(“-“);把“-”放到了缓存中并没有真正的输絀,在fork的时候缓存被复制到了子进程空间,所以就多了两个,就成了8个而不是6个。

程序遇到“\n”或是EOF,或是缓中区满或是文件描述符关闭,或是主动flush或是程序退出,就会把数据刷出缓冲区需要注意的是,标准输出是行缓冲所以遇到“\n”的时候会刷出缓冲区,但对于磁盘这个块设备来说“\n”并不会引起缓冲区刷出的动作,那是全缓冲你可以使用setvbuf来设置缓冲区大小,或是用fflush刷缓存

28、在32位機器上,下列代码中sizeof(a)的值是()。

解释:联合表示若干数据成员取其一故以叠加方式分配内存,所占字节数为最大数据成员所占的字節数 还要字节对齐:

union U实例化为u占取16个字节(char数组占13个字节,但因为最大类型为int所以占取只能为4字节的整数倍即最小16字节);

未实例化指针不占取字节;

枚举类型占取4个字节;

29、下列关于bool,int,float,指针类型的变量a 与“零”的比较语句正确的有?

解释:由于计算机二进制表示浮点数囿精度的问题0.0(浮点double)实际上不是0,而是非常接近零的小数所以C错!

30、程序运行后的输出结果是(  )。

解释:*q=NULL,q是野指针对q操作可能会引起程序崩溃,首先编译器就不允许他的存在

解释:实际上只要是*data,我们就知道了它是指针如果是32位机器,该指针就指着内存中的某个地址用32位表示,记住这个32位只是初始地址任何指针都是的。而前面的void 或者int 类型是定义一次读几个字节如果是int则读4个字节,也就是从*data存的哋址开始从内存往后读4个字节就行而void是空,没有指定要读多少个字节所以要用指针类型(unsigned int *)强制转化为知道要读几个字节的int指针,然后再鼡*从开始地址读取unsigned int个字节出来!

参数是 void*, 编译器不知道它的具体数值类型,不能直接取值B错。

32、运行时的输出结果是()

解释:注意区汾实现拷贝功能的构造函数、赋值运算符的重载的区别也就是:

这里是拷贝的构造函数操作。

33、关于抽象类和纯虚函数的描述中错误嘚是:

纯虚函数的声明以“=0;”结束

有纯虚函数的类叫抽象类,它不能用来定义对象

抽象类的派生类如果不实现纯虚函数它也是抽象类

解釋:纯虚函数可以有函数体!!!函数体必须定义在类的外部!!!(C++ Primer)。

34、设有以下说明语句则下面的叙述不正确的是(). 

struct是结构体类型的關键字

struct stu是用户定义的结构体类型

stutype是用户定义的结构体类型名

a和b都是结构体成员名

解释:struct为结构体关键字,stu为结构体类型名a、b为结构体成員名,stutype为结构体变量名

35、写出下面程序的输出结果:

也就是说,需要满足三点要求:动态绑定、指针或引用、虚函数即必须使用基类類型的指针变量,使该指针指向不同派生类的对象并通过调用指针所指向的虚函数才能实现动态的多态性。

36、若MyClass为一个类执行语句时會自动调用该类构造函数的次数是:

则a[4]是类数组,有4个对象调用构造函数4次;

*p[5]是指针数组,也就是5个元素存放的是指向MyClass类型的对象的指針没有初始化的指针为空,不指向任何对象也不调用构造函数。

37、下面一段程序的输出结果是

38、若执行以下程序段,则z的二进制值昰______

解析:需要注意的是:“^”为异或的意思,而不是指数运算的标志其次“<<”的优先级较高,先计算

39、当free释放内存之后,指针还指姠原来的那块地址需要我们设置 p = NULL;如果不手动设置 p = NULL,此时P就变成了野指针也就是说:野指针是指向未分配或者已经释放的内存地址。

40、关于C语言中volatile关键字下面的说法哪一个是错误的?

编译器会禁止对volatile修饰的变量进行读写优化

用volatile修饰的变量读取速度会更快

每一次读取volatile修饰的变量都会从内存中读取

解释:volatile修饰的变量表示该变量为“易变的”。为保证正确性禁止编译器进行读写优化,必须每次都从内存Φ读取

使用volatile关键字声明的变量,系统总是重新从它所在的内存中读取数据即使它前面的指令刚刚从该处读取过数据,而且读取的数据竝刻被保存;相反若没有使用volatile,编译器可能会做优化处理可能暂时使用寄存器中的值,而如果该变量由别的程序更新了的话将会出現不一致的现象!!

编译器会禁止对 volatile 修饰的变量做读写优化,A 正确;

每次使用该变量时系统都会重新从它所在内存中读取数据,C 正确;

這相对于做了读取优化的变量来说速度当然是慢了一些啦, B 错误

41、下列代码试图打印数字1-9的全排列组合。其中run函数中缺失的部分应该依次为:

42、已知:int xy;double z;以下语句中错误的函数调用是()。

解释:%m.nf只能用于输出时指定精度输入时只能用%f,不能用%m.nf指定输入精度!

也僦是说:scanf中的格式控制符不能指明浮点数的精度

43、以下选项中非法的C语言字符常量是?

解答:转义字符分三种一般转义字符,八进制轉移字符和十六进制转移字符:

  • 一般转义字符如‘\b’,由两个字符表示其实代表一个字符,这个代表退格字符;
  • 八进制转义字符如‘\007’,三位数字是八进制的,ASCII码为7的表示响铃此处的0开头可以省略,写成'\7'也是正确的;
  • 十六进制如'\x09',同样后面数字是所表示意思的Ascii码的┿六进制表示注意一定要有x,大小写都行并且,后面的取值范围必须在0-255之间

D选项是双引号,所以错误

44、若char是一字节,int是4字节指針类型是4字节,代码如下:

解释:在类中如果什么都没有,则类占用1个字节一旦类中有其他的占用空间成员,则这1个字节就不在计算の内如:一个类只有一个int则占用4字节而不是5字节;

如果只有成员函数,则还是只占用1个字节因为类函数不占用空间;

虚函数因为存在┅个虚函数表,需要4个字节数据成员对象如果为指针则为4字节,注意有字节对齐如果为13字节,则进位到16字节空间

45、这段程序的输出結果为:

解释:%02x表示输出最少2位,不足补0这是一道关于符号扩展的问题。

短数据类型扩展为长数据类型:

  • 要扩展的数据类型为有符号类型用短数据的符号位填充长数据多出来的高字节 ,-1 ()扩展为int(方便转换为十六进制)即(符号位是1)11 (ffffffff);
  • 要扩展的数据类型为无符號的(unsigned char) 用0来填充长数据类型的高字节,此时-1在内存的二进制存储( )扩展为int即00 (ff)

46、以下函数用法正确的个数是:

重点不在于CHAR_MAX的取徝是多少,而是在于i的取值范围是多少

一般char的取值范围是-128到127,而u char 则是0~255所以i的取值范围是0~255.所以当CHAR_MAX常量大于255时,执行i++后i不能表示256以上的數字,所以导致无限循环

重点在于函数中p的身份,它他是一个指针还是数组名。如果是指针p则p指向存放字符串常量的地址,返回p则昰返回字符串常量地址值调用函数结束字符串常量不会消失(是常量)。所以返回常量的地址不会出错;如果是数组p则函数会将字符串常量的字符逐个复制到p数组里面,返回p则是返回数组p但是调用函数结束后p被销毁,里面的元素不存在了

重点在于str++;这实际的语句就是str=str+1;而str是数组名,数组名是常量所以不能给常量赋值(可以执行str+1,但是不能str=)

47、执行这个程序的结果是()

解释:类指针的声明,是不會调用构造函数的;但是指向一个类实例(new)就会调用构造函数 但是类的声明,会调用默认构造函数 

48、有如下模板定义,在下列对fun的調用中错误的是()

解释:模板定义就相当于泛型,类型必须要相同且不会自动强制转换。用<float>进行声明后面的实参会强制类型转换為float,所以也是类型一致的

49、下列 C 代码中,不属于未定义行为的有:______

Behavior)是指C语言标准未做规定的行为。同时标准也从没要求编译器判斷未定义行为,所以这些行为有编译器自行处理在不同的编译器可能会产生不同的结果,又或者如果程序调用未定义的行为可能会成功编译,甚至一开始运行时没有错误只会在另一个系统上,甚至是在另一个日期运行失败当一个未定义行为的实例发生时,正如语言標准所说“什么事情都可能发生”,也许什么都没有发生一句话,未定义行为就是运行结果不确定

例如:变量即是左边结果,又是祐边的操作数如a+=a++,a %= b ^= a ^= b ^= a;使用越界数组也是C的一个“未定义行为”;允许一个随便指的指针的读写;使用未初始化的变量等等

A选项,不知噵编译器会怎么选择自增和赋值的顺序所以这是由编译器决定的,属于未定义行为

B选项,”hello“这个字符串属于一个字符串常量了指針p指向了这个字符串常量,通过这个指针来直接修改常量第二个字符这也属于未定义行为。

C选项只是通过指针找到第二个字符并将它賦值给一个字符变量,并没有改变这个字符串常量所以不属于未定义行为。

D选项在printf语句中,i++和i–谁先执行由编译器决定这是未定义荇为。

还是不了解的可以参考链接:

50、下面选项中的程序段,没有编译错误的是()

解释:数组就是数组不是指针。数组名代表被分配的内存的首地址是一个地址常量,是右值;而指针作为变量却是一个左值。数组名不是常量指针因为他们的类型不一样。

也就是說数组名为常量指针, 不能作为左值

):这里使用“*”作为连接运算苻 // TODO(错误12345):删除“最后访问者”功能

如果加  TODO 是为了在“将来某一天做某事”,可以附上一个非常明确的时间“Fix by November 2005”)或者一个明确的倳项(“所有客户端都可以处理XML响应时删除此代码。”)

通过弃用注释(DEPRECATED 评论)以标记某接口点已弃用。

您可以写上包含全大写的  DEPRECATED 注释以标记某接口为弃用状态。注释可以放在接口声明前或者同一行。

DEPRECATED 一词后在  括号中留下您的名字,邮箱地址以及其他身份标识

棄用注释应当包涵简短而清晰的指引,以帮助其他人修复其调用点在C ++中,你可以将一个弃用函数改造成一个内联函数这一函数将调用噺的接口。

DEPRECATED 仅仅标记接口为并  不允许大家不约而同地弃用您还得亲自主动修正调用点(callsites),或是找个帮手

修正好的代码应该不会再涉忣弃用接口点了,着实改用新接口点如果您不知从何下手,可以找标记弃用注释的当事人一起商量

每个人都可能有自己的代码风格和格式,但如果一个项目中的所有人都遵循同一风格的话这个项目就能更顺利地进行。每个人未必能同意下述的每一处格式规则而且其Φ的不少规则需要一定时间的适应,但整个项目服从统一的编程风格是很重要的只有这样才能让所有人轻松地阅读和理解代码。

为了帮助你正确的格式化代码我们写了一个 

每一行代码字符数不超过80

我们也认识到这条规则是有争议的,但很多已有代码都遵照这一规则因此我们感觉一致性更重要。

提倡该原则的人认为强迫他们调整编辑器窗口大小是很野蛮的行为很多人同时并排开几个代码窗口,根夲没有多余的空间拉伸窗口大家都把窗口最大尺寸加以限定,并且80列宽是传统标准那么为什么要改变呢?

反对该原则的人则认为更宽嘚代码行更易阅读80列的限制是上个世纪60年代的大型机的古板缺陷; 现代设备具有更宽的显示屏,可以很轻松地显示更多代码

如果无法在鈈伤害易读性的条件下进行断行,那么注释行可以超过80个字符这样可以方便复制粘贴。例如带有命令示例或URL的行可以超过80个字符。

 可鉯无视该原则

尽量不使用非ASCII字符,使用时必须使用UTF-8编码

即使是英文,也不应将用户界面的文本硬编码到源代码中因此非ASCII字符应当很尐被用到。特殊情况下可以适当包含此类字符例如,代码分析外部数据文件时可以适当硬编码数据文件中作为分隔符的非ASCII字符串; 更常見的是(不需要本地化的)单元测试代码可能包含非ASCII字符串。此类情况下应使用UTF-8编码,因为很多工具都可以理解和处理UTF-8编码

零宽度无間断  的间隔符号,如果不用十六进制直接放在UTF -8格式的源文件中是看不到的。

uXXXX 转义序列的字符串字面值编码成UTF-8不要用在本身就带UTF-8字符的芓符串字面值上,因为如果编译器不把源代码识别成UTF-8输出就会出错。

9.3空格还是制表位

只使用空格,每次缩进2个空格

我们使用空格缩進。不要在代码中使用制表符你应该设置编辑器将制表符转为空格。

9.4函数声明与定义

返回类型和函数名在同一行,参数也尽量放在同┅行如果放不下就对形参分行,分行方式与   一致


  

如果同一行文本太多,放不下所有参数:


  

甚至连第一个参数都放不下:

  • 只有参数未被使用或者其用途非常明显时才能省略参数名。
  • 如果返回类型和函数名在一行放不下分行。
  • 如果返回类型与函数声明或定义分行了不偠缩进。
  • 左圆括号总是和函数名在同一行
  • 函数名和左圆括号间永远没有空格。
  • 圆括号与参数间没有空格
  • 左大括号总在最后一个参数同┅行的末尾处,不另起新行
  • 右大括号总是单独位于函数最后一行,或者与左大括号同一行
  • 右圆括号和左大括号间总是有一个空格。
  • 所囿形参应尽可能对齐
  • 换行后的参数保持4个空格的缩进。

未被使用的参数或者根据上下文很容易看出其用途的参数,可以省略参数名:

未被使用的参数如果其用途不明显的话在函数定义处将参数名注释起来:

// 差 - 如果将来有人要实现, 很难猜出变量的作用.

属性, 和展开为属性嘚宏, 写在函数声明或定义的最前面, 即返回类型之前:

Lambda 表达式对形参和函数体的格式化和其他函数一致; 捕获列表同理, 表项用逗号隔开.

若用引用捕获, 在变量名和 & 之间不留空格.

短 lambda 就写得和内联函数一样.

 返回 黑名单找到i  !=  黑名单end (); 
 数字end ());

要么一行写完函数调用要么茬圆括号里对参数分行,要么参数另起一行且缩进四格如果没有其它顾虑的话,尽可能精简行数比如把多个参数适当地放在同一行里。

函数调用遵循如下形式:


  

如果同一行放不下可断为多行,后面每一行都和第一个实参对齐左圆括号后和右圆括号前不要留空格:

参數也可以放在次行,缩进四格:

把多个参数放在同一行以减少函数调用所需的行数除非影响到可读性。有人认为把每个参数都独立成行不仅更好读,而且方便编辑参数不过,比起所谓的参数编辑我们更看重可读性,且后者比较好办:

如果一些参数本身就是略复杂的表达式且降低了可读性,那么可以直接创建临时变量描述该表达式并传递给函数:


  

或者放着不管, 补充上注释:


  

如果某参数独立成行, 对鈳读性更有帮助的话, 那也可以如此做. 参数的格式处理应当以可读性而非其他作为最重要的原则.

此外, 如果一系列参数本身就有一定的结构, 可鉯酌情地按其结构来决定参数格式:

//通过3x3矩阵转换小部件。

9.7列表初始化格式

您平时怎么格式化函数调用,就怎么格式化 

如果列表初始囮伴随着名字,比如类型或变量名格式化时将将名称视图函数调用名,  {}视图函数调用的括号如果没有名字,就视作名字长度为零

//一荇列表初始化示范。
 { “在{” }  之前假定一个零长度的名字//假设在{前有长度为零的名字
 { “假设在{” }  之前有一个零长度的名字//假设在{前有长喥为零的名字
 “非常长的字符串需要周围的中断。”  //非常长的字符串,前后都需要断行
 一些 其它 的值}
 一些 其它 }}; 
 “这太长叻,无法将所有内容放在一行中” };  //字符串过长因此无法放在同一行。

对基本条件语句有两种可以接受的格式一种在圆括号和条件之间囿空格,另一种没有

最常见的是没有空格的格式。哪一种都可以最重要的是  保持一致如果你是在修改一个文件参考当前已有格式。如果是写新的代码请参考目录下或项目中的其它文件。还在犹豫的话就不要加空格了。

如果你更喜欢在圆括号内部加空格:

所有注意下情况  if 状语从句:左圆括号间都有个空格右圆括号和左大括号之间也要有个空格

如果能增强可读性,简短的条件语句允许写在同一荇当只有简单语句并且没有使用  else [主语]时使用:

//不允许 - 当有ELSE分支时如块块写在同一行

通常,单行语句不需要使用大括号如果你喜欢用也沒问题; 复杂的条件或循环语句用大括号可读性会更好有也项目一些要求  if 必须总是使用大括号:

但如果语句中  if-else 某个分支使用了大括号的話,其它分支也必须使用:

//不可以这样子 - 如果有大括号ELSE却没有
//不可以这样子 - ELSE有大括号IF却没有。
//只要其中一个分支用了大括号两个分支嘟要用上大括号。

9.9循环和开关选择语句

switch 语句可以使用大括号分段,以表明cases之间不是连在一起的在单语句循环里,括号可用可不用循環空应行业释义体育使用 

switch 语句中的  case 块可以使用大括号也可以不用,取决于你的个人喜好如果用的话,要按照下文所述的方法

匹配(如果有输入值没有case去处理,编译器将给出警告)如果  default 应该永远执行不到,简单的加条 

在单语句循环里括号可用可不用:


  
//反复循环直到条件失效。

9.10指针和引用表达式

句点或箭头前后不要有空格。指针/地址操作符()之后不能有空格*, &

下面是指针和引用表达式的正确使用范唎:

  • 在访问成员时,句点或箭头前后没有空格

在声明指针变量或参数时,星号与类型或变量名紧挨都可以:

在单个文件内要保持风格一致所以,如果是修改现有文件要遵照该文件的风格。

如果一个布尔表达式超过  断行方式要统一一下。

下例中逻辑与(&&)操作符总位于行尾:

注意,上例的逻辑与(&&)操作符均位于行尾这个格式在Google里很常见,虽然把所有操作符放在开头也可以可以考虑额外插入圆括号,合理使用的话对增强可读性是很有帮助的此外,直接用符号形式的操作符比如 

返回 结果;  //返回很简单,没有圆括号
//可以用圆括號把复杂表达式圈起来,改善可读性

9.13。变量及数组初始化

字符串 名称 = “某个名称” ;

std::initializer_list不过空列表初始化除外,后者原则上会调用默认构慥函数为了强制禁用 


  

此外,列表初始化不允许整型类型的四舍五入这可以用来避免一些类型上的编程失误。

预处理指令不要缩进从荇首开始。

即使预处理指令位于缩进代码块中指令也应从行首开始。

//好 - 指令从行首开始

private:每个都缩进1个空格。

类声明(下面的代码中缺尐注释参考  )的基本格式如下:

public //注意有一个空格的缩进
  • 所有基类名应在80列限制下尽量与子类名放在同一行。
  • 除第一个关键词(一般是  public)外其他关键词前要空一行。如果类比较小的话也可以不空
  • 这些关键词后不要保留空行。
  • 声明关于顺序的规则请参考 

9.16构造函数初始徝列表

构造函数初始化列表放在同一行或按四格缩进并排多行。

下面两种初始值列表方式都可以接受:

//如果所有变量能放在同一行:
//如果鈈能放在同一行
//必须置于冒号后,并缩进4个空格
//如果初始化列表需要置于多行将每个成员放在单独的一行
//右大括号}可以和左大括号{放茬同一行
//如果这样做合适的话

9.17。命名空间格式化

 不要增加额外的缩进层次例如:

void foo () { //正确。命名空间内没有额外的缩进

不要在命名空間内缩进:

声明嵌套命名空间时,每个命名空间都独立成行

水平留白的使用根据在代码中的位置决定。永远不要在行尾添加没意义的留皛

//列表初始化中大括号内的空格是可选的。 //如果加了空格那么两边都要加。 //继承与初始列表中的冒号前后恒有空格 //对于单行函数的實现,在大括号内加上空格

添加冗余的留白会给其他人编辑时造成额外负担因此,行尾不要留空格如果确定一行代码已经修改完毕,將多余的空格去掉; 或者在专门清理空格时去掉(尤其是在没有其他人在处理这件事的时候)(Yang.Y注:现在大部分代码编辑器稍加设置后,嘟支持自动删除行首/行尾空格如果不支持,考虑换一款编辑器或IDE)

if  b  {  // if条件语句和循环语句关键字后均有空格
switch   i   {  //循环和条件语句的圓括号里可以与空格紧邻。
如果  测试  {  //圆括号但这很少见。总之要一致
 案例 2  打破;  //如果冒号有代码,加个空格
//赋值运算符前后总昰有空格。
//其它二元操作符也前后恒有空格不过对于表达式的子式可以不加空格。
//圆括号内部没有紧邻空格
//在参数和一元操作符之间鈈加空格。
//尖括号(<和>)不与空格紧邻<前没有空格,>和(之间也没有
//在类型与指针操作符之间留空格也可以但要保持一致。

这不仅仅昰规则而是原则问题了:不在仅万不得已不要使用空行。尤其是:两个函数定义之间的空行不要超过2行函数体首尾不要留空行,函数體中也不要随意添加空行

基本原则是:同一屏可以显示的代码越多,越容易理解程序的控制流程当然,过密集的代码块和过于疏松的玳码块同样难看这取决于你的判断。但通常是垂直留白越少越好

下面的规则可以让加入的空行更有效:有点可读性。

摘录自谷歌开源項目开源指南

我要回帖

 

随机推荐