C++基础【通俗易懂】

一、基础语法

1.1、数据类型

1)整型:也就是整数的类型

数据类型关键字大小
短整型short2byte
整型int4byte
长整型longwin下4byte,其它8byte
长长整型long long8byte
# include <iostream>
int main(){
    //sizeof 获取一个数据类型或者变量的空间占用大小
    std::cout << "short:"<<sizeof(short) << std::endl;
    std::cout << "int:" << sizeof(int) << std::endl;
    return 0;
}

2)浮点型:小数类型

数据类型关键字大小
单精度类型(小数点后7位)float4byte
双精度类型(小数点后15位)double8byte

3)布尔类型:描述真和假,关键字bool,只占用一个字节,有两个值true和false

4)字符型:描述文本类型最小的组成单位,关键字char,只占用一个字节

5)字符串类型:由若干个字符组成,关键字string

1.2、变量和常量

1)变量:可以修改的值----在使用之前要进行赋值

# include <iostream>
int main(){
    // 变量的定义语法:变量类型 变量名
    int num;
    // 定义变量的同时赋初值
    float num2 = 1.2f;
    // 变量的值可以进行修改
    num = 23;
    // 定义多个相同类型的变量,并初始化
    int num3 = 100,num4 = 200;
    // 定义字符变量
    char ch = 'a'
    std::cout << "ch=" << ch << std::endl;
    // 定义字符串类型
    std::string m = "rgds";
    return 0;
}

2)常量:不可以修改的值,定义常量时使用关键字const,常量名一般大写,在定义时就要进行赋值

# include <iostream>
int mian(){
    // 定义常量,使用关键字const
    const int NUM = 10;
    std::cout << "NUM的值为:" << NUM << std::endl;
    return 0;
}

1.3、类型转换

1)自动类型转换:

由取值范围小的数据类型,向取值范围大的数据类型转换,转换的过程不需要进行额外的操作,直接赋值就可以,不存在精度丢失问题

# include <iostream>
int main(){
    // 定义一个short类型的变量
    short num1 = 12;
    // 转为int类型,直接赋值给int类型的变量即可
    int num2 = num1;
    return 0;
}

注意:byte,short,char类型的数据参与运算的时候,结果会自动提示为int类型

2)强制类型转换:

由取值范围大的数据类型,向取值范围小的数据类型转换,转换的过程需要进行强制类型转换操作,转换完成后可能会存在精度丢失问题

# include <iostream>
int main(){
    // 强制类型转换---将取值范围大的float类型转为int类型
    int a = (int)12.34;
}

1.4、键盘录入

# include <iostream>
int main(){
    // 定义变量接收键盘输入的整数
    int n1 = 0;
    std::cout << "请输入有个整数:";
    // 键盘录入
    std::cin >> n1;
    std::cout << "你输入的值为:" << n1 << std::endl;
    
    // 定义字符串
    std::string str = "";
    std::cout << "请输入字符串:";
    std::cin >> str;
    std::cout << "你输入的字符串为:" << str << std::endl;
}

忽略缓冲区中的内容,默认忽略一位

// 不指定忽略位数,默认一位
std::cin.ignore()
// 忽略两位
std::cin.ignore(2)
// 忽略缓冲区中没有读走的全部数据
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');

错误处理:cin内部会维护一个状态,来记录本次的读取操作是否正常,注意如果标记为fail状态,程序会停止,影响下次输入,使用清空缓冲区的方法解决

// cin.good()---为1表示成功
int good = std::cin.good()
// cin.fail()---为1表示失败
int fail = std:cin.fail()
// cin.clear()---恢复状态---再此之后一般跟上清空缓冲区的语句
std::cin.clear()

1.5、宏定义

宏定义就是在文件的头部使用关键字#define来定义的标识符,程序中用到这个宏定义的时候就会替换成相应的值

# include <iostream>
// 宏定义
#define SUCCESS 1
#define EE (2+2)
#define SE 2+2
int main(){
  // 使用宏定义输出4*4的结果
    std::cout << EE * EE << std::endl;
    // 使用宏定义计算出8
    std::cout << SE *SE << std::endl;
    // 这里使用宏定义,SUCCESS会被替换成1,相当于返回1
    return SUCCESS
}

1.6、命名空间

命名空间就是解决命名冲突的问题,使用关键字namespace可以更好的控制标识符的作用域

// 格式:namespace 名称{命名的语句}
# include <iostream>
 // 定义一个命名空间
namespace a {
    int num = 10;
    // 命名空间可以嵌套
    namespace aa {
        int num = 20;
    }
}
namespace c {
    int num = 100;
}
​
int main(){
    // 使用命名空间的变量
    std::cout << a::num << std::endl;
    // 使用嵌套的
    std::cout << a::aa::num << std:endl;
    
    namespace b {
        int num = 50;
    }
}
​
// 命名空间是开放的,可以随时添加新成员
namespace b{
    int name = '张三'
}

使用命名空间中的变量是,需要命名空间名称调用

// 使用命名空间中的变量
命名空间名称::变量名
std::cout << 命名空间名称::变量名 << std::endl;
// 嵌套命名空间变量的使用
外层名称::内层名称::变量名
std::cout << 外层名称::内层名称::变量名 << std::endl;

优化命名空间中变量的使用格式,使用using关键字

// 指定命名空间中的具体成员
using 命名空间名称::具体成员;
std::cout << 成员名称 << std::endl;
​
// 指定命名空间中的所有成员
using namespace 命名空间名;
std::cout << 直接使用指定命名空间中的所有成员名 << std::endl;

注意:当多个命名空间中有相同名称的变量时,使用using简化后直接使用名称,会出现二义性,这种现象使用常规引用

1.7、运算符

1)算数运算符,赋值运算符,关系运算符,逻辑运算符,位运算符,三目运算,都与java中的运算符相同

1.8、随机数

1)产生随机数:

//随机数格式:
int random = rand() % n               -- 表示产生0-(n-1)之间的随机数

2)设置种子数:

//设置种子数,使产生的随机数不一样
srand((unsigned int)time(NULL));      -- 使用到的time函数需要导入ctime包

二、流程控制

2.1、if-else语句

注意:如果大括号中只有一条语句,大括号可以省略

1)if基础语法

if (判断条件){
    条件成立执行的语句;
}

2)if-else语句

if (判断条件){
    条件成立执行的语句;
}else{
    条件不成立执行的代码;
}

3)else if语句

if (判断条件1){
    条件1成立执行的代码;
}else if(判断条件2){
    条件2成立的代码;
}else{
    都不成立执行的代码;
}

2.2、switch语句

switch语句检查某一个变量,从上往下依次和case后面的语句进行校验,case语句中的值必须为常量值,不能是一个范围值

# include <iostream>
using namespace std;
​
int main(){
    int num = 0;
    cout << "请输入数字:" << endl;
    cin >> num;
    switch(num){
        case 1:
            cout << "春暖花开" << endl;
            break;
        case 2:
            cout << "夏季" << endl;
            break;
        case 3:
            cout << "秋高气爽" << endl;
            break;
        case 4:
            cout << "冬天" << endl;
            break;
        default:
            cout << "输入错误!" << endl;
            break;
    }
}

switch语句的穿透性:没有break后从匹配的case语句后面依次向下执行,直到遇到break停止,计算天数的时候,利用穿透的性质可以依次加入下一月份的天数

int main(){
    int year = 0,mounth = 0,day = 0;
    cout << "请输入年:";
    cin >> year;
    cout << "请输入月:";
    cin >> mounth;
    cout << "请输入天数:";
    cin >> day;
    int days = day;
    switch(mounth){
        case 12:
            days = day + 31;     // 计算12月的天数和11月的天数
        case 11:
            days = day + 30;     // 计算11月的天数和10月的天数
        case 10:
            days += 31;          // 计算10月份的天数和9月的天数
        case 9:
            days += 30;         // 计算9月的天数和8月的天数
        case 8:
            days += 31;          // 计算8月的天数和7月的天数
        case 7:
            days += 30;          // 计算7月的天数和6月的天数
        case 6:
            days += 31;          // 计算6月的天数和5月的天数
        case 5:
            days += 30;          // 计算5月的天数和4月的天数
        case 4:
            days += 31;          // 计算4月的天数的3月的天数
        case 3:
            if (year%4==0&&year%100!=0||year%400==0){
                days += 29;
            }else{
                days += 28;
            }
        case 2:
            days += 30;
        default:
            cout << "输入错误!" << endl;
    }
  cout << year << "年" << mounth << "月" << day << "天是这一年的:" << days << "天" << endl;
}

2.3、循环结构

1)while循环:

// 格式:
while(判断条件){
  循环体;
}
  • while循环本身没有循环变量的声明和初始化的组成部分,如果需要变量,需要在循环开始前进行声明,并赋值

  • while循环本身也没有控制循环的终止条件,需要在循环体中添加控制语句,否则会出现死循环

注意:cin.fail()判断键盘输入的是否正确,cin.clear()情况输入错误的状态cin.ignore(numeric_limits<streamsize>::max(),'\n')清空一整行缓存

int mian(){
    int num;
    cin >> num;
    // 循环判断输入是否正确
    while(cin.fail()){
        // 如果不正确,先清空错误状态,在清空缓存,在重新输入
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(),'\n');
        cin >> num;
    }
    return 0;
}

2)do-while循环:

先执行一次循环体,在判断条件是否成立,do-while循环的循环体一定会执行一次

// 格式:
    do{
        循环体;
    }while(条件判断); 

3)for循环:

小括号中的语句之间使用分号分隔

// 格式:
for(循环起点;循环条件;条件控制语句){
  循环体;
}

注意:sstream包中的ostringstream定义的变量可以进行拼接

# include <iostream>
# include <sstream>
using namespace std;
int main(){
    // 定义两个变量统计个数
    int num1 = 0, num2 = 0;
    //定义两个ostringstream类型的变量拼接满足条件的结果
    ostringstream strnum1,strnum2;
    const char *str = "12hii3koj";
    int len = strlen(str);
    for (int i = 0; i < len; ++i) {
        if('a' <= str[i] && 'z' >= str[i]){
            num1++;
            strnum1 << str[i];
        }
        if('0' <= str[i] && '9' >= str[i]){
            num2++;
            strnum2 << str[i];
        }
    }
    cout << "数字个数:" << num2 << endl;
    cout << "数字分别是:" << strnum2.str() << endl;
    cout << "字母个数:" << num1 << endl;
    cout << "字母分别是:" << strnum1.str() << endl;
    return 0;
}# include <iostream>
# include <sstream>
using namespace std;
int main(){
    // 定义两个变量统计个数
    int num1 = 0, num2 = 0;
    //定义两个ostringstream类型的变量拼接满足条件的结果
    ostringstream strnum1,strnum2;
    const char *str = "12hii3koj";
    int len = strlen(str);
    for (int i = 0; i < len; ++i) {
        if('a' <= str[i] && 'z' >= str[i]){
            num1++;
            strnum1 << str[i];
        }
        if('0' <= str[i] && '9' >= str[i]){
            num2++;
            strnum2 << str[i];
        }
    }
    cout << "数字个数:" << num2 << endl;
    cout << "数字分别是:" << strnum2.str() << endl;
    cout << "字母个数:" << num1 << endl;
    cout << "字母分别是:" << strnum1.str() << endl;
    return 0;
}

2.4、流程控制关键字

1)break:

用于终止某一个程序快的执行,在循环中break表示跳出当前的循环,switch中表示跳出switch语句

2)continue:

只能用在循环语句中,表示终止本次循环,开始下一次循环

3)goto:

在程序中可以设置指定的标签,goto语句可以跳转到指定标签的位置,继续执行,标签必须为合法的标识符

2.5、嵌套循环

在循环中嵌套循环,内层循环和外层循环

1)九九乘法表:

for循环实现:

int main(){
    for(int i = 1; i<=9;i++){
        for (int j = 1; j <= i; ++j) {
            cout << j << "*" << i << "=" << (i*j) << '\t';
        }
        cout << endl;
    }
    return 0;
}

while循环实现:

int main(){
    int i = 1,j;
    while(i<=9){
        j = 1;
        while(j<=i){
            cout << j << "*" << i << "=" << (i*j) << '\t';
            j++;
        }
        cout << endl;
        i++;
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值