C和C++学习遇见的零碎知识点

C和C++零碎知识点


1.移位运算的优先级和加减操作的优先级相同;

2.C++中全局变量个局部变量同名时,优先使用局部变量,如果想使用全局变量,需要给变量名称前面加上::表示这个变量是一个全局命名空间下的变量;
示例:

#include <iostream>
using namespace std;

int val = 1;	//全局变量

int main()
{
	int val = 2;
	//输出局部变量
	cout << val << endl;
	//输出全局变量
	cout << ::val << endl;
	return 0;
}

运行结果:
在这里插入图片描述
3.C++编译器对于成员变量的初始化顺序和声明顺序是一致的

4.对于单个参数的构造函数,最好使用explicit关键字禁止隐式类型转换

5.运行时类型识别:typeid
typeid是运算符,通过typeid(变量名).name()可以查看变量类型

6、cin输入数据在遇见第一个有效数据之前会过滤掉遇见的空格和回车
7.fgets和gets都可以获取一行输入,但是fgets更加安全

gets使用:

	//char *gets(char *s);
 	char buf[1024] = {0};
	gets(buf);      //这个函数编译会有警告,但是不影响正常的使用

fgets使用:

	//char *fgets(char *s, int size, FILE *stream);
	char buf[1024] = {0};
	char* ret = fgets(buf, 1023, stdin);

8.空白基类最优化
当一个类中没有定义任何数据成员时,这个类是一个空类,编译器会为它分配1个字节,当这个类作为基类被继承时,派生类的大小就等于派生类本身的大小,这就是空白基类最优化

9.关于switch的default的位置
switct语句中的default子句可以放在任意位置,但一般最好放在最后。
示例:
代码1:default在最后

#include <stdio.h>

int main()
{
	int input = 99;
	int n = input / 10;
	switch (n)
	{

	case 6:
	case 7:
		printf("良好\n");
		break;
	case 8:
	case 9:
		printf("优秀\n");
		break;
	case 10:
		printf("恭喜满分\n");
		break;
	default:
		printf("不及格\n");
		break;
	}
	return 0;
}

运行结果:
在这里插入图片描述
代码2:default在开头

#include <stdio.h>

int main()
{
	int input = 99;
	int n = input / 10;
	switch (n)
	{
	default:
		printf("不及格\n");
		break;
	case 6:
	case 7:
		printf("良好\n");
		break;
	case 8:
	case 9:
		printf("优秀\n");
		break;
	case 10:
		printf("恭喜满分\n");
		break;
	
	}
	return 0;
}

运行结果:
在这里插入图片描述
分析:
当进行调试时,无论default在任何位置,会先根据n找对应的case语句,当找不到执行default语句;

10.关于switch语句中表达式的类型
只能是整型常量表达式或者枚举类型,
如int,char,long,enum
char为什么可以视为整型?
字符类型和整型之间可以相互转化,以ASCII码为中介

switch语句使用正确示例:

#include<stdio.h>
enum season{
	spring,
	summer,
	autume,
	winter
};

void main()
{
	enum season A;
	A = spring;
	switch (A)
	{
	case spring:
		printf("春天\n");
		break;
	case summer:
		printf("夏天\n");
		break;
	case autume:
		printf("秋天\n");
		break;
	case winter:
		printf("冬天\n");
		break;
	default:
		printf("某种奇妙的天气\n");
		break;
	}

}

错误示范:

#include <stdio.h>

int main()
{
	int input = 99;
	float n = input / 10.0;   //!!!!!!!!!!error
	switch (n)
	{
	case 6:
	case 7:
		printf("良好\n");
		break;
	default:
		printf("不及格\n");
		break;
	case 8:
	case 9:
		printf("优秀\n");
		break;
	case 10:
		printf("恭喜满分\n");
		break;
	
	}
	return 0;
}

error:
在这里插入图片描述
11.typedef重定义的类型作为表达式非法,这是编译器的一个bug,在使用重定义的类型时,要查看前面的语句有没有用{}括起来,如果没有最好括起来,这样编译器就能识别你的类型了。

12.C 语言规定,在一个源程序中,main函数的位置可以任意

13.位运算符的优先级和+、-的优先级相同,所以计算时候如果需要优先进行位运算就要加括号.

例如下面的代码计算两个数的中位数,预期的目标是让left 加上(right - left)右移一位的结果,
但是因为运算符的优先级问题,left 会先加上right - left,然后再将计算结果右移一位。

	int mid = left + (right - left) >> 1;
	//正确形式: int mid = left + ((right - left) >> 1);

14.C++获取一行字符串输入

string str;
getline(cin, str);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值