2840 words
14 minutes
0 views
c++语法知识点
2023-01-10
2025-09-02

c++程序设计#

by:小鸭呀

来源:信息学奥赛一本通+菜鸟教程+oiwiki+我的脑袋

本文章遵循cc协议,转载请署名

对于本文章的建议或纠错可以发表评论哦(=^^)

[TOC]

(如果支持的话应该上面会显示个目录)

让程序不闪退的神奇代码#

system("pause")版本4.99以前

getchar() 约等于 system(“pause”)

注释#

//这是一行注释
/*这是有头有尾的注释*/

标识符#

含义:标识实体(变量名,函数名,对象名)

由大小写字母,下划线和数字0~9组成

必须以大小写字母和下划线开头

运算符#

啥子运算符干啥的长啥样
算数运算符数值运算+,-,*,/(如果俩操作数是整数,则为整除),% (俩操作数必须是整数) ,++,—(七种)
关系运算符比较运算>,<,==,<=,>=,!=(六种) 返回布尔值
逻辑运算符逻辑运算&&,||,!
位操作运算符二进制运算&,|,~(非),^(异或),<<,>>(六种)
赋值运算符赋值运算简单赋值(=),复合算数赋值(+=,-=,*=,/=,%=),复合位运算赋值(&=,|=,^=,<<=,>>=)三类共十一种
条件运算符条件求值条件?结果a:结果b 条件成立,用结果a,否则用结果b
逗号运算符把若干个表达式组合成一个表达式,
指针运算符取内容,取地址取内容(*),取地址(&)
求字节数运算符数据类型所占字节数sizeof(数据类型)
特殊运算符玛卡巴卡( ) [ ] . ->

优先级#

自己打括号

常用库函数#

依赖cmath库:

格式功能
abs(x)/fabs(x)绝对值
exp(x)e的x次方
floor(x)向下取整
ceil(x)向上取整
log(x)x的自然对数
pow(x,y)x的y次方
sqrt(x)根号
round(x)四舍五入
sin,cos,tan,acos,asin,atan三角函数

依赖cstdlib库

格式功能
rand()0到RAND-MAX之间随机取一个整数

依赖ctime库

格式功能
clock()返回程序从开始运行了多少秒

依赖algorithm库

格式功能
sort(a,a+n,cmp)对长度为n的a数组排序,用cmp方法

常量#

定义常量#

#define 变量名 数据

const 类型 变量名 = 数据;

常量初始化后不可以改变

整型常量#

十进制形式#

如:99,-1

八进制形式#

0开头

如:012

十六进制形式#

0x开头

如:0x12A

变量#

int i = 5,j,k(5); //i,j,k为整型变量,i,k是5,j未知

a = b = c = 2 等同于 c = 2;b = c;a = b;

标准数据类型#

整型与实型#

数据类型定义标识符
短整型short [int]
整型[long] int
长整型long [int]
超长整型long long [int]
无符号整型unsigned [int]
无符号短整型unsigned short [int]
无符号长整型unsigned long [int]
无符号超长整型unsigned long long
单精度实型float
双精度实型double
长双精度实型long double
布尔bool
枚举类型enum

注:科学计数法是指数形式的表示方法,十进制小数E整数指数,例如

1.2×1051.2\times10^5

就是1.2E+5

枚举类型#

enum 枚举名{
标识符,标识符,标识符(=整型常数)
} 枚举变量;
//举个栗子
enum food{drink,eat=5}c;
c=drink;

重定义数据类型#

typedef int metre;

转义字符#

转义字符含义
\b退格
\r不换行的回车
\0
\n回车

char类型里+32是大写转小写,-32是小写转大写

强制类型转换:类型名(被转换的可怜变量)

输入输出#

事先说明:

#include<iostream>
#include<cstdio> //这个章节的内容必须有这些语句
using namespace std;

cout用小于,cin用大于

getchar#

输入单个字符,无参

char ch;ch=getchar();

putchar#

输出单个字符,有参

putchar(66) 根据ASCII码66是字符B,输出B

cout#

setw#

要导入iomanip库

#include<iomanip>
cout<<setw(6)<<a;

setw控制输出的宽度

cstdio 库#

输入#

scanf("%类型",&变量名)

格式符:

格式符说明
d,i十进制整数
u无符号十进制整数
o八进制整数
x十六进制整数
c单个字符
s字符串(非空格开始,空格结束)
f,e实数

附加格式说明符:

附加格式说明
l(L字母)长整型或double型
h短型数
域宽(一个整数)输入多少东西
*不赋值给变量

scanf(“%4d,%4d”,&a,&b);

cout<<a<<’,‘<<b<<endl;

如果输入的是12345678,则输入为1234,5678

scanf有返回值!!!!!#

返回了成功读取的变量的个数哦!!!

while(scanf("%d",&x) != EOF){
​ 语句
}

如果成功读取,就执行语句

输出#

printf(格式控制符,输出列表)

格式符#
格式符说明
d或i十进制整数
u无符号十进制整数
x或X十六进制无符号整数(没有前导符0x)
o八进制无符号整数(没有前导符0)
c字符
s字符串
f单、双精度小数,一般6位
e或E单、双精度以指数形式输出小数,一般6位
d格式符#
参数说明
d数字本身长度
md输出m位
-md同上,但左对齐
ld长整型
mld输出m位,左补空格
0md或0mld位数不足m位补0
f格式符#
参数说明
f实数格式,小数6位
m.nf总位数m(含小数点),n位小数
-m.nf同上,左对齐
s格式符#
参数说明
s字符串
ms指定宽度m
-ms同上,左对齐
m.ns输出m个字符位置,字符数最多n个
-m.ns同上,左对齐

分支#

if#

//基本
if(条件){
主体;
}
//if...else
if(条件){
主体1;
} else {
主体2;
}
//else if
if (条件1) {
主体1;
} else if (条件2) {
主体2;
} else if (条件3) {
主体3;
} else {
主体4;
}

switch#

case后面要加break哦

//实例
switch (a){
case 1:{
xxx;
break;
}
case 2:{
xxx;
break;
}
default :{
xxx;
}
}

循环#

for#

for(初始化;条件;更新){
循环体;
}

while#

while(条件){
循环体;
}

do…while#

do {
循环体;
} while (条件);

break 和 continue#

break跳出循环,continue结束本次循环,前往下次循环

数组#

初始化:

int a[5] = {1,2,3,4,5} //初始化
int a[5] = {} //初始化为0
int a[5] = {1,2} //初始化为1,2,0,0,0
//读取
a[i];

复制#

#include<cstring>
memcpy(b,a,sizeof(a)) //a复制到b
memcpy(b,a,sizeof(/*a的数据类型*/)*k) //a复制k个元素到数组b

清零#

#include<cstring>
int a[5];
memset(a,0/*除了str类型的数组其它只能为0和-1*/,sizeof(a)) //清零

二维数组#

数组的数组

格式#

数据类 数组名 [常量表达式1] [常量表达式2]

创造后为:常量表达式1行,常量表达式2列

程序运行时间#

#include<ctime>
#include<iostream>
using namespace std;
int main(){
...代码
cout<<clock()/CLOCKS_PER_SEC<<endl; //输出用时
}

字符类型、字符数组和字符串#

序号函数 & 目的
1strcpy(s1, s2); 复制字符串 s2 到字符串 s1。
2strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。连接字符串也可以用 + 号,例如: string str1 = "runoob"; string str2 = "google"; string str = str1 + str2;
3strlen(s1); 返回字符串 s1 的长度。
4strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。
5strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

字符类型#

一个字符

字符数组#

装字符的数组

输入#

gets(字符串名称);

getchar(); //返回字符,回车后才输入

只能输入一个字符串!!!

输出#

puts(字符串名称);

putchar(一个字符);

输入后会自动换行

字符串#

结尾为”\0“,不计入字符串的实际长度

字符串的输入输出#

cin:输入、忽略开头的制表符、换行符、空格。遇到空格或换行停止(不会读取空字符)

getline:输入、直接读取一行内所有内容,包括空格。格式为getline(cin,字符串变量)

字符串的常用操作#

字符串s的操作意义
s.empty()s空?返回true否则false
s.size()s中字符个数
s[i]s中第i个,从0开始
s1+s2连接s1和s2
s1=s2s1替换为s2的副本
s1==s2一样true,否则false
!=,<,<=,>,>=原意,不变
s.insert(pos,s2)s里面pos位置前插入s2
s.substr(pos,n)返回从pos起的n个字符,返回string
s.erase(pos,n)删除从pos起的n个字符
s.replace(pos,n,s2)替换从pos起的n个字符为s2
s.find(s2,pos)寻从pos下标起查找s2第一次出现的位置,找不到返回string::npos
s.c_str返回与s内容相同的C语言风格的字符串临时指针
sscanf(s,“%d”,%N)约等于n=int(s)
sprintf(s,“%d”,N)约等于s=str(n)
s.substr(2,4)python中s[2,2+4-1]

字典序#

定义#

从前往后,挨个比较。第i不同,用i比较。如果相等,谁长谁大。一样的话,相等。

方法#

s1.compare(s2)

如果相等返回0,s1小于s2返回小于0,s1大于s2返回大于0

注意#

字符串和字符数组的区别在于字符串的结尾是’\0’

函数#

定义#

void swap(int &a,int &b);//声明
//主体
void swap(int &a,int &b){
int tmp = a;a = b;b = tmp;
}

传址调用

匿名函数#

[闭包](参数){函数体} //不指定返回值类型
[闭包](参数) -> 返回值类型 {函数体} //指定返回值类型

闭包#

[] //未定义变量.试图在Lambda内使用任何外部变量都是错误的.
[x, &y] //x 按值捕获, y 按引用捕获.
[&] //用到的任何外部变量都隐式按引用捕获
[=] //用到的任何外部变量都隐式按值捕获
[&, x] //x显式地按值捕获. 其它变量按引用捕获
[=, &z] //z按引用捕获. 其它变量按值捕获
//来源:https://www.cnblogs.com/pzhfei/archive/2013/01/14/lambda_expression.html

文件操作#

freopen#

需要导入cstdio库

#include<cstdio>
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
fclose(stdin);fclose(stdout);/*
freopen("CON","r",stdin);
freopen("CON","w",stdout);*/

fopen#

fopen版本

//定义文件指针
FILE *fin,*fout;
fin=fopen("in.txt","rb");
fout=fopen("out.txt","wb");
fscanf(fin,"%d",&temp);
fprintf(fout,"%d\n",sum);
fclose(fin);fclose(fout);
//切换回标准输入输出
fin=stdin;
fout=stdout;
fscanf(fin,"%d",&temp);
fprintf(fout,"%d\n",sum);

#

#include<cstdio>
#include<fstream>
ifstream fin("haoye.in");//定义输入流fin
ofstream fout("huaiye.out");//定义输出流fout
int main(){
//fin输入,fout输出,用法和cin,cout一样
fin.close();
fout.close();
return 0;
}

结构体#

建立#

struct 名字 {
类型名 变量名;
结构体名字指针 变量名;
} 变量名;

访问#

名字.元素
指针->元素
(*指针).元素

指针#

定义和运算#

说明样例
定义:类型 *变量名int a=10;int *p;
取地址运算符:&p = &a;
间接运算符:**p = 20;

指针可以和整数加减,每加一,偏移一个类型的长度

初始化#

方法说明
int *p = NULL;声明零指针
int a;int *p=&a;p初始化为a的地址
int *p = new(int);申请一个空间给p,*p内容不确定

无类型指针#

void *p;
int a = 10;
p = &a;
cout<<*(int*)p<<endl;

指针作为函数参数#

void swap(int *x,int *y){
int t=*x;
*x=*y;
*y=t;
}

函数指针#

int t(int a){
return a;
}
int main(){
cout<<t<<endl;
int (*p)(int a);//定义函数指针变量,不能写成*p(int a)
p=t;
cout<<p(5)<<","<<(*p)(10)<<endl;
return 0;
}

还有一种定义的方法

void t1(){cout<<"1";}
void t2(){cout<<"2";}
void t3(){cout<<"3";}
void t4(){cout<<"4";}
int sum(int a,int b){return a+b;}
typedef int (*LP)(int,int);
typedef void(*aa)();
int main(){
aa a[]={t1,t2,t3,t4}
a[1](); //输出2
LP p = sum;
cout<<p(2,5); //返回7
}

结构体指针#

struct a{
float b;
} *p;//这个可以
a *p;//这个也行
//应用结构体指针变量
p->b
(*p).score

动态#

int *p = new int(1234);
delete p;
int *p = new int[114514];
delete[] p;

类(oop)#

//基本:
class 类名{
//访问修饰符:private/public/protected
//变量
//方法
返回类型 operator/*跟上要改的运算符号*/(参数){
阿巴阿巴;
};
virtual int haoye(){//调用函数的时候都用子类的,不用这个函数
;
}
};
//派生类
class 好耶 : public/*访问修饰符*/ 坏耶 ,其他父类...{
阿巴阿巴;
int haoye(){
;
}
};
c++语法知识点
https://blog.haoye.plus/posts/cpp-grammar/
Author
ctww
Published at
2023-01-10
License
CC BY-NC-SA 4.0
Refresh if you can't see the comment session / 如遇评论区未正常加载,请刷新此页面