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);