一.运算符的优先级
一共15个级别
- 最高优先级 : () []
- 最低优先级 :逗号表达式
- 倒数第二低优先级 : 赋值和符合赋值(=,==,-=...)
- ! >算术运算符 > 关系运算符 > && >> || >赋值运算符
二.数据类型转换
- 隐式类型转换
- 算数转换
- char int long longlong float double
- 尽量不丢失精度,会将计算结果往精度大的类型转换
- 例如 : 15 + 3.14 => 15.0 +3.14
- 赋值转换
- int x = 3.14*10.0;
- 转换为int类型时候,因为赋值符号的左边变量为int,则将类型转换为int类型
- 结果为 31
- 输出转换(C语言)
- printf("%c",255+50);
- 305的二进制数是 0000 0001 0011 0001,由于超过了一个字节所能存储的最大数,,所以会将0000 0001挤到第二个字节里面去,该字节就存放0011 0001,十进制为49,即ASCLL码为49,转换为字符为 ' 1 '
- 若按%d 进行输出,则输出为305,因为int占四个字节,足够容纳305的二进制
- 算数转换
- 强制类型转换
- c语言 (数据类型)数据 (int)3.14
- c++语言 数据类型(数据) int(3.14)
- x = (char)257 + 100;
- 257为int类型,其二进制为 1 0000 0001,转换成char类型会将保留8位,结果位0000 0001,这样结果在和int类型的100相加,等于 1+ 100 = 101
- 高级强制类型转换
- static_cast
- dynamic_cast
- reinterpert_cast
三.switch和if的选择
- switch : 用于 int char long longlong类型的变量,和多个特定常量的判断处理
- float和都变了类型不可以
- if适用于各种逻辑判断
- switch一定能改为if,if不一定能改为switch
四.const int*p与int* const p 的区别
int i =0;
int t = 2;
const int *p = &i;//可以改变p的指向,但是不能通过*p改变指向变量的值
int* const p1 = &i;//可以通过*p改变指向变量的值,但是不能在指向其他变量了
//*p = 3;//error
//p = &t;//pass
//*p1 =3;//pass
//p1 = &t;error
- 常量指针可以指向常量或变量,不能将常量指针赋值给普通指针
五.底层Const和顶层Const的区别
- 底层const用于修饰指针或引用目标对象,表示目标对象是常量,不可修改。
- 顶层const用于修饰指针或引用本身,表示指针或引用本身是常量,无法指向其他对象。
-
顶层const,指针本身是常量
六.不安全函数
- scanf_s函数
int x;
scanf_s("%d",&x);//不需要使用第三个参数,用法和scanf相同
float f;
scanf_s("%f",&f);//不需要使用第三个参数,用法和scanf相同
char c;
scanf_s("%c",&c,sizeof(c));//需要使用第三个参数,否则有警告
char name[16];
scnaf_s("%s",name,sizeof(name));//需要使用第三个参数
int age;
char name[16];
scanf_s("%d%s",&age,name,sizeof(name));
- gets函数不能使用
- 使用gets_s,gets函数是老标准C语言函数,vs使用更安全的C11标准,使用对应的gets_s
char line[32];
gets_s(line,sizeof(line));
六.cin>> 返回值
- if((cin>>word) == 0){}//在vs里面不能通过编译
- 解决方法
if(!(cin>>word)){}//方法1
if((bool)(cin>>word) == 0){}//方法2
七.getline返回值是cin
- 返回值是cin
getline(cin, word) >> count;
if(getline(cin,line)==0){}//错误,不能通过编译
- 解决方案和上面cin的解决方法一样,可以强制转换类型或者加上逻辑非
八.计算机英语加油站
- bool 布尔 逻辑类型
- if 如果
- else 否则
- switch 开关
- case 情况
- default 默认
- commit 提交
- clone 克隆 复制
九.goto语句
- 例子 :
string ret;
for(int i = 0;i<5;i++){
cout<<"开始第"<<i+1<<"次相亲..."<<endl;
cout<<"你喜欢打王者吗?"<<endl;
cin>>ret;
if(ret != "yes") continue;
else{
cout<<"我中意你,你中意我吗?"<<endl;
cin>>ret;
if(ret == "yes"){
goto happy;
}
}
}
happy :
cout<<"幸福生活"<<endl;
cout<<"开启幸福之旅"<<endl;
return 0;
}
- goto在应用开发中不建议用,会破坏程序的结构性,一般用在底层开发,追求效率
- 语法 :goto 标志; 标志:
- goto在应用开发中一般将标志后面的语句封装为函数,进行函数调用 ; 或者用flag进行标记,标记成立执行标志后的代码
- 标签必须和goto 标志;必须放在同一个函数内,不能跨函数,但是可以在同一个函数的任何位置
十.cmd
- 切换盘 直接 d:或者c:
- 进入某个文件,用cd 例如 cd d:\ceshi,就会进入d盘下的ceshi目录
- 查看编码用chcp(活动码)
- 修改编码用: chcp 编码 ,例如 chcp 936,会改为936编码
- 在一个目录下放两个exe文件,利用破解.exe | 客户.exe,会将前面程序的输出数据,通过管道作为后面文件的输入数据
- 利用dir查看目录下面的文件
十一.VS播放音乐
- 头文件
#include<mmsystem.h>
#prama comment(lib,"winmm.lib")
- 加载音乐代码
mciSendString(_T("play 音乐地址 repeat"),0,0,0);
- _T可以用多字符集替代
- play 播放
- repeat 重复
十二.宽度与对其
- c++中的设置文本宽度头文件为#include<iomanip>,语句为setw(宽度)
- 设置对其 : 例如左对齐 std::left
十三.原地交换字符串
- 当left = right时,没有必要再交换,也可也用于交换其他数据类型
string str;
int left,right;
cout<<"输入一个字符串: ";
cin>>str;
left = 0;
right = str.length()-1;
while (left<right){
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
left++;
right--;
}
cout<<str<<endl;
十四.终端
- 控制终端大小
- mode con cols = 列数,lines =行数
- system("任何终端命令");,再system里面可以写任何终端命令进行执行
- 例如 : system("mode con cols=40 lines=15");
十五.string转char*类型
- 函数c_str()函数可以将string类型转换为从const char*类型
using namespace std;
void print(const char * str){
cout<<str;
}
int main() {
string str = "LiHua";
const char* p = str.c_str();//const,char*类型
print(str);//这样会报错,形参与实参的类型不匹配
print(str.c_str());//不会报错,将string 转成const char*
}