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

1,#include的<>和""

对于#include而言,后面的文件所使用的是双引号或尖括号。

  • 双引号:表示寻找被包含文件的方式是现在源程序所在的目录中搜索;如果搜索不到,则按系统设定的标准方式搜索目录。
  • 尖括号:仅仅搜索系统指定目录。

2,const函数特点
  1. 不能在const函数中修改所在类的对象的数据,因为const函数中的*this是常量,同样只能访问const函数;
  2. const函数与同名的非const函数是重载函数;
  3. const对象只能调用const函数 ,但是非const对象可以调用const函数。
  4. 之所以const函数中只能调用其他的const函数,不能调用非const函数,因为对象调用函数是需要传递对象自己,const函数中的*this是常量,非const函数中的*this是变量,因此不可以调用(除非去除*this的const属性);
    注:使用const_cast后,可以在const函数中调用非const函数。

3,字符串赋值问题

对于问题:
在c语言中,下面能正确进行字符串赋值操作的是?
1,char s[5]={"ABCDE"};
这个赋值是错误的,因为s定义为5个元素的字符型数组,即最多能存放5个字符,而字符串结尾’\0’无法存放。

2,char *s; scanf("%s",s);
这个赋值也是错误的,因为此时是“野指针”赋值,而野指针赋值很有可能出现问题。而之所以可能会出现问题,是因为野指针指向的位置不确定,随意更改其中的值,很有可能出错。
在这里插入图片描述

3,char *s;s="ABCDE";
这个赋值方法就是正确的了。先定义字符指针s,而后将字符串"ABCDE"的首地址赋值给指针变量s,是正确的赋值。


4,指针指向同一地址的思考

对于问题:
当参数*x=1, *y=1, *z=1时,下列不可能是函数add的返回值是多少?

int add(int *x, int *y, int *z){
    *x += *x;
    *y += *x;
    *z += *y;
    return *z;
 }

这道题看起来有点莫名其妙,其实考虑的是,对于指针x、y、z,这三个参数所指向的是否是同一个地址(或者说,调用该函数时,实参是不是一样的):
设a = b = c = 1,那么:
add(&a,&a,&a) 与 add(&a,&b,&c)在*x,*y,*z上是一样的,但是返回值的结果却是不同的。
最后的返回结果一共有以下五种情况:
在这里插入图片描述

因此,返回值可能是4,5,6,8,唯独不可能是7。


5,结构化程序设计

结构化程序设计的目的:

  • 通过设计结构良好的程序,以程序静态的良好的结构保证程序动态执行的正确性,使程序易理解、易调试、易维护,以提高软件开发的效率,减少出错率。

6,赋值语句问题
  • 强制类型转换,其格式为:
    (类型说明符)(表达式)
    其中,类型说明符和表达式都必须加括号(单个变量可以不加括号)。
  • k = 2*4, k*4;
    上面这种语句的写法是正确的,这是C语言中的逗号表达式。其中,k的值为8,而上面整个式子的值为32,即如果有:
    a = (k = 2*4, k*4),则a的值就位32。

c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值


7,构造函数与析构函数的调用顺序

对于问题:

Class A;
Class B;
void F() {
        A a;
        B b;
}

在函数F中,本地变量a和b的构造函数(constructor)和析构函数(destructor)的调用顺序是什么?

  • 在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反,即先构造的后析构,后构造的先析构。
  • 按变量声明顺序构造对象,然后入栈。
  • 按相反顺序出栈,析构对象。

因此,这道题的答案为:
a构造 b构造 b析构 a析构


8,C语言的基础特点

C语言是介于汇编语言和高级语言之间的一种语言,由于它可以直接访问物理地址,对硬件操作,所以C语言既可以编写应用程序,又可以开发系统软件,而且C语言程序可移植性好于汇编语言,程序清晰,具有模块化的特点,是一种结构式模块化的设计语言。


9,变量初始化的方式

对于一个整型变量,我们在对其初始化时,可以直接赋值:

  • int a = 5;

也可以使用如下的方法:

  • int a(5);

10,字符数组的输入

对于题目:
若char a[10],则如何从键盘上输入数据到a数组中?

方法1:

  • gets(a);
    gets()函数用于从缓冲区中读取字符串,其原型如下:
    char *gets(char *string);
    gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束。所读取的字符串暂存在给定的参数string中。
    返回值】:若成功则返回string的指针,否则返回NULL。

方法2:

  • scanf("%s", a);

方法3:

  • for(i=0;i<10;i++) a[i]=getchar();
    函数getchar()用于从标准输入控制台读取字符,原型如下:
    int getchar(void);
    参数】:该函数没有参数。
    返回值】:函数的返回值为用户输入的第一个字符的ASCII码,若出错返回-1,且将用户输入的字符回显到屏幕。如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续getchar()调用读取。 也就是说,后续的getchat()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。
    而诸如:a = getcgar();的写法,自然就是错误的了,因为getchar不管输入的字符串有多长,每次都只能获取一个字符变量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值