c++基本语法
运算符
首先假设a=2,b=3
运算符 | 描述 | 实例 |
---|---|---|
+ | 把两个操作数相加 | a+b=5 |
- | 从第一个操作数中减去第二个操作数 | b-a=1 |
* | 把两个操作数相乘 | a*b=6 |
/ | 分子除以分母 | b/a=1 |
% | 取模运算符,整除后的余数 | b%a=1 |
++ | 自增运算符,整数值增加1 | b++=4 |
– | 自减运算符,整数值减少1 | a–=1 |
关系运算符
还是先假设a=2,b=3
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A==B)不为真。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A!=B)为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A>B)不为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A<B)为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A>=B)不为真。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A<=B)为真。 |
赋值运算符
这个很少会用到,只做理解要求
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C=A+B将把A+B的值赋给C |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C+=A相当于C=C+A |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C-=A相当于C=C-A |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C=A相当于C=CA |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C/=A相当于C=C/A |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C%=A相当于C=C%A |
i++与++i的区别
其实这个不是很难理解
i++其实就是先把这一行运行 i这个值/赋值什么的 完成以后,再在下一步增加一行i++
而++i就相反
i++其实就是先在上一步增加 i++ 完成以后,再在下一步用i++后的值进行运算
下面来看下实例
首先我们来看
第一行,先对i进行了赋值
然后第二行,是sum=i++
根据我们上面所说的
那么我们可以改写为
所以说,sum被赋值的值是 7!!!
而不是 i++后的8
所以最后输出的还是7
但是我们要注意一下以下的情况
先算一算结果是多少吧?
首先到了第三行的时候
所以我们知道
最后,sum=3+4+5=12
而 i 是 6
逻辑运算符
这次假设a=1,b=0
运算符 | 描述 | 实例 |
---|---|---|
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A&&B)为假。 |
|| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A||B)为真 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A&&B)为真。 |
&&是并,全部是,才是 || 是或,有一个是就行
数组
其实和python里面的列表是一模一样的,就是他可以放的东西比较局限,只能放入数字,
创建数组的方法
int list[x];
其实和设置变量是差不多的,如果你在变量后面加上了 [ ]
那么他就是一个 数组
而 [] 里面的 x 代表的是这个列表有多长
如何赋值捏?
第一种全部赋值法,只能用于初始化数组的时候,后面就只能一个个赋值
int a[3] = {0,1,2};
int b[] = {1,2,3,4}; //b和a的效果是一样
int aa[2][2] = {0,1, 5,6}; //二维数组
第二种,就像python一样那样子赋值
int list[20];
list[0]=10;
list[1]=11;
.
.
.
.
所以没什么好说的?
但是!!!!
初始化数组的时候里面的全部数据都是随机的
例如上面的
int list[2];
cout << list[1];
输出
2600960
所以如何让数组全为0,捏?
第一种方法
把数组开在i主函数的外面
第二种方式
int list[2]={0};
那么就全是0了
字符数组
和上面一样,不多赘叙
特别地,字符数组不能放入单词或是中文。。。
定义
char c[3];
c[0] = 'a';
c[1] = 'b';
c[2] = 'c';
等价于
char c[3] = {'a','b','c'};
又等价于
char [] = {'a','b','c'};
又等价于
char [] = 'abc';
又等价于
char [] = {'abc'};
如果出现单词,那么数组会自动把单词拆分为一个个字母并录入数组当中
几个函数
sizeof() : 获取的是字符数组的大小,而不是字符数组里字符的长度,也就是整个数组的长度
strlen():字符数组里字符的长度(长度不算’\0’) size_t strlen(char *str)
仅仅只是数组里面含有内容的长度
char a[20]="sunday";
sizeof(a); //结果是20不是6
strlen(a); //6
strcpy():将后面的字符串赋值到前面的字符数组中
就是后面的替代了前面的
char list[20]= "abc";
strcpy(list,"d");
for (int i = 0; i < strlen(list); i++)
{
putchar(list[i]);
}
输出的是
d
strcmp():比较两个字符串的大小 int strcmp(const char *str1,const char *str2)
相等:返回0 str1<str2: 返回-1 str1>str2:返回1
注意:比的不是两个字符串的长度,而是字符在ascii码中对应的数值比如hello<how
int ret=strcmp("hello","how");
printf(ret); //-1
strcat():将两个字符串连接到一起 char *strcat(char *str1,const crar *str2)
将后面的字符串拼接到前面的字符串后面,注意只有str2可以用const修饰
注意:拼接后的字符长度一定要小于str1的数组长度,否则无法容纳
char d[20]="haha";
char c[10]="xixi";
strcat(d,c);
puts(d); //hahaxixi
gets类似于scanf函数,用于读取标准输入。
区别是 停止的标准是 换行,而不是像scanf的空格
gets 函数从STDIN(标准输入)读取字符并把它们加载到str(字符串)中,直到遇到换行符(\n)或到达EOF。gets遇到\n后,不会存储\n,而是将其直接翻译为空字符’\0’
char a[10];
gets(a);
printf(a)
puts类似于printf函数,用于输出标准输出。
相对于printf函数,puts 只能用于输出字符串,同时多打印一个换行符。
等价于printf(“%s \n” , c);
char a[10];
gets(a);
puts(a);
getchar和putchar也可以用于输入以及输出,但是只限于一个字符
判断语句
这个其实没什么好说的,和python的逻辑基本一致,只是写法不同
if
int a=1;
int b=2;
if (a+1==b)
{
/* code */
printf("yes");
}
输出
yes
while
int i=0;
int x=6;
while (i<=10)
{
i++;
cout << x << " ";
}
输出
6 6 6 6 6 6 6 6 6 6 6
另一种情况
int i=0;
int x=6;
do{
i++;
cout << x << " ";
}while (i<=10);
酱紫是先循环在进行判断是否再循环,所以基本会比上一种情况多一次循环
输出
6 6 6 6 6 6 6 6 6 6 6
函数
这一部分其实和python是十分像的,所以也不多赘叙,只是简单地写一下他的语法
int fun(int a,int b)
{
printf("%d",a+b);
return 5;
}
int main()
{
printf("\n%d",fun(1,2));
// 先执行函数,再执行printf
return 0;
}
输出
3
5
首先,一般的函数都会有返回值,默认返回值是1 !!!
如果想没有返回值,那么设置函数的类型可以使用 void
用法,其实一样
void c(int a,int b)
{
printf("%d\n",(a+b)*2);
}
int main()
{
c(1,2);
return 0;
}
输出
6
酱紫就没有返回值了
结构体
其实这个和python的类是很像的,就是可能没有函数?只能储存变量
创建结构体
struct book
{
string name;// 第一个变量,类型为字符串,可以存储长字符
int prize;// 第二个变量,类型为 int
string author;// 第一个变量,。。。
};
创建“对象”,并且初始化里面的变量
struct book
{
string name;// 第一个变量,类型为字符串,可以存储长字符
int prize;// 第二个变量,类型为 int
string author;// 第一个变量,。。。
};
int main()
{
book one;
one.name = "hello";
one.prize = 17;
one.author = "yourself";
}
酱紫我们就可以调用结构体的变量数值
struct book
{
string name;// 第一个变量,类型为字符串,可以存储长字符
int prize;// 第二个变量,类型为 int
string author;// 第一个变量,。。。
};
int main()
{
book one;
one.name = "hello";
one.prize = 17;
one.author = "yourself";
cout << one.name;
}
输出
hello
另一种方式初始化数值
book two={"haha",20,"me"};
cout << two.name;
输出
haha
还可以嵌套结构体
但是好像没什么用
struct book
{
string name;
int prize;
string author;
};
struct person
{
string name1;
int age;
string gender;
struct book haha;
};
int main()
{
person jenny={"jenny",20,"gril"};
jenny.haha ={"haha",10,"jenny"};
cout << jenny.haha.prize;
}
其实就是相当于
相当于思维导图
递归
emm没什么好说的,其实就是return哪里的东西,和python基本一样,因为是个逻辑算法
就是有点费脑子
// 递归部分
int fac(int n)
{
if(n==0) return 1;//如果参数是0或者1返回1
else return n*fac(n-1);//否则返回n和下次递归的积
}
int main()
{
int n;
cin>>n;
cout<<fac(n);//函数调用
return 0;
}
就酱紫吧