1.变量和常量
1.1变量的创建
我们把经常变化的值称为变量,不变的值称为常量。
data_type name;
| |
| |
数据类型 变量名
1 int age; //整型变量
2 char ch; //字符变量
3 double weight; //浮点型变量
变量的命名规则遵循以下原则:
- 变量名只能由字母、数字下划线组成,且必须以字母或下划线开头。
- 变量名不能以纯数字开头,也不能包含特殊字符。
- 变量名不能使用语言的关键字,如char、int等。
- 变量名应具有意义,有助于理解变量的含义和用途。
- 变量名应简短明了,避免使用过长的名称。
- 变量名应区分大小写。
1.2变量初始化
变量在创建的时候就给一个初始值,就叫初始化。
1 int age = 18;
2 char ch = ‘w’;
3 double weight = 48.0;
4 unsigned int height = 100;
1.3变量的分类
- 全局变量:在大括号外部定义的变量就是全局变量。
- 局部变量:在大括号内部定义的变量就是局部变量。
#include "iostream"
using namespace std;
int global=100; //全局变量
int main()
{
int local=200; //局部变量
cout << local << endl;
cout << global <<endl;
return 0;
}
在局部变量和全局变量同名的时候,局部变量优先使用
#include "iostream"
using namespace std;
int local=100;
int main()
{
int local=200;
cout << local << endl;
return 0;
}
全局变量和局部变量在初始化上主要有以下区别:
- 全局变量:全局变量通常在定义时就被初始化,如果没有明确指定初始值,它们通常会被初始化为0。
- 局部变量:局部变量通常不会自动初始化。它们需要在使用之前明确地赋值或初始化。如果没有初始化,它们的值将是未定义的,使用未初始化的局部变量可能会导致不可预测的行为或运行时的错误。
1.4常量
常量就是不能被改变的值,通常我们会用三种常量:
- 字面常量
- #define定义的常量
- const定义的常量
1.4.1字面常量
整型常量:100,-5,0,0x123整型常量一般可以写成10进制、8进制、16进制。
字符常量:‘a’
浮点型常量:3.14,1E6
1.4.2#define定义常量
1 #define 常量名 内容
代码举例:
#include <iostream>
using namespace std;
#define M 100
#define CH 'x'
#define PI 3.14159
int main()
{
cout << M << endl;
cout << CH << endl;
cout << PI << endl;
return 0;
}
1.4.3const定义常量
1 const 类型 常量名字 = 常量值;
代码举例:
#include <iostream>
using namespace std;
const double PI = 3.14159;
int main()
{
int r = 0;
cin >> r;
cout << "周⻓:" << 2 * PI * r << endl;
cout << "⾯经:" << PI * r * r << endl;
return 0;
}
使用const定义常量的好处:
- 增加了程序的可读性。
- 增加了程序的可维护性,如果改变常量的值,只要在定义的部分修改,使用的地方也就随之改变了。
- 常量是不能修改的。
1.5练习
练习1:牛牛买电影票_牛客题霸_牛客网
#include"iostream"
using namespace std;
int a;
int main()
{
cin>>a;
cout<<100*a<<endl;
return 0;
}
练习2:B2007 A + B 问题 - 洛谷
#include"iostream"
using namespace std;
int main()
{
int a=0;
int b=0;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
练习3:B2614 【深基1.习6】鸡兔共笼 - 洛谷
#include"iostream"
using namespace std;
int main()
{
int a=0;
int b=0;
int c=35;
int f=94;
a=(4*c-f)/2;
b=c-a;
cout<<b<<" "<<a<<endl;
return 0;
}
2.算数操作符
2.1算数操作符
算数操作符分别是:+、-、*、/、%,这些操作符都是双目操作符。
#include"iostream"
using namespace std;
int main()
{
int a = 7 + 2; //加法运算
int b = 7 - 2; //减法运算
int c = 7 * 2; //乘法运算
int d = 7 / 2; //除法运算,得到的是整除后的商
int e = 7 % 2; //取余运算,得到的是整除后的余数
cout << a << endl;
cout << b << endl;
cout << c << endl;
cout << d << endl;
cout << e << endl;
return 0;
}
易错:
- /除法的操作符,除数不能为0,如果除数为0,程序会崩溃。
- %取模操作符的计算结果是两个操作数进行除法运算后的余数。
- 取模操作符的操作数只能是整型,不能是浮点型,这个编译器会报语法错误。
2.2浮点数的除法
#include <iostream>
using namespace std;
int main()
{
float x = 6 / 4;
cout << x << endl; // 1
float y = 6.0 / 4; // 6/4.0结果是⼀样的
cout << y << endl; // 1.5
return 0;
}
整数除法是整除,只会返回整数部分,丢弃小数部分。
如果要得到浮点数的结果,两个运算数必须至少有一个浮点数,这时就会进行浮点数除法。
2.3负数取模
负数也是支持取模的,但是负数求模结果的正负号由第一个运算数的正负号决定。
#include <iostream>
using namespace std;
int main()
{
cout << 11 % -5 << endl;
cout << -11 % -5 << endl;
cout << -11 % 5 << endl;
return 0;
}
2.4练习
练习1:B2008 计算 (a+b)×c 的值 - 洛谷
#include"iostream"
using namespace std;
int a,b,c;
int main()
{
cin >> a >> b >> c;
int r = (a+b)*c;
cout << r <<endl;
return 0;
}
练习2:B2010 带余除法 - 洛谷
#include"iostream"
using namespace std;
int a,b;
int main()
{
cin >> a >> b;
int s = a/b;
int y = a%b;
cout << s << " " << y << endl;
return 0;
}
练习3:整数的个位
#include"iostream"
using namespace std;
int a;
int main()
{
cin >> a;
int r = a%10;
cout << r <<endl;
return 0;
}
练习4:整数的十位
#include"iostream"
using namespace std;
int a;
int main()
{
cin >> a;
cout << a%100/10 << endl;
return 0;
}
练习5:1031-时间转换_牛客竞赛语法入门班顺序结构习题
#include"iostream"
using namespace std;
int seconds;
int main()
{
cin >> seconds;
cout << seconds/60/60 << " " << seconds/60%60 << " " << seconds%60 << endl;
return 0;
}
练习6: P1425 小鱼的游泳时间 - 洛谷
#include"iostream"
using namespace std;
int main()
{
int a,b,c,d;
cin >> a >> b >> c >> d;
int h,m;
int t=-a*60-b+c*60+d;
h=t/60;
m=t%60;
cout << h << " " << m << endl;
return 0;
}
3.赋值操作符
在变量创建的时候给一个初始值叫初始化,在创建好后,再给一个值,这叫赋值。
赋值操作符=是一个随时可以给变量赋值的操作符,赋值运算符是把右边的值赋给左边的。
3.1连续赋值
int a = 3;
int b = 5;
int c = 0;
c = b = a + 3; //连续赋值,从右向左依次赋值的。
3.2复合赋值符
复合赋值符 | 样例 | 一般写法 |
+= | a+=10 | a=a+10 |
-= | a-=10 | a=a-10 |
*= | a*=10 | a=a*10 |
/= | a/=10 | a=a/10 |
%= | a%=10 | a=a%10 |
3.3练习
练习1:账户余额
#include"iostream"
using namespace std;
int main()
{
int m=100;
m+=10;
cout << m << endl;
m-=20;
cout << m << endl;
m=0;
cout << m << endl;
return 0;
}
练习2:信息学奥赛一本通(C++版)在线评测系统
#include"iostream"
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
int c=a;
a=b;
b=c;
cout << a << " " << b <<endl;
return 0;
}
4.类型转换
4.1混合运算时的类型转换
整型提升:表达式中的char和short类型一定会先转换成int类型,然后参与运算。
算数转换:表达式中出现下面的任意两种类型的值进行计算的时候,要先将较下面的类型转换成另外一种类型才能计算。
1 long double
2 double
3 float
4 unsigned long int
5 long int
6 unsigned int
7 int
4.2赋值时类型转换
当赋值操作符两端的数据类型不一致时,就需要类型转换。
- float和double赋值给int,直接截断小数部分,保留整数部分。
- 较小的类型转换较大类型,直接转换,值不变。
- 较大类型转换较小的类型,一般会发生截断,按照较小类型的长度,保留低位数据给较小的类型。
4.3强制类型转换
(类型名)表达式
例如:
double d = 3.14;
int a = (int)d;
4.4练习
练习1:1034-[NOIP2017]成绩_牛客竞赛语法入门班顺序结构习题
#include"iostream"
using namespace std;
int a,b,c;
int all;
int main()
{
cin>>a>>b>>c;
all=(int)(a*0.2+b*0.3+c*0.5);
cout<<all<<endl;
return 0;
}
练习2:B2016 浮点数向零舍入 - 洛谷
#include"iostream"
using namespace std;
double x;
int main()
{
cin>>x;
cout<<(long long int)x<<endl;
return 0;
}
练习3:B2017 打印 ASCII 码 - 洛谷 
#include"iostream"
using namespace std;
int main()
{
char c=0;
cin>>c;
cout<<(int)c<<endl;
return 0;
}
5.单目操作符
5.1++和--
- 前置++或者后置++,都是让操作数自增1的
- 前置--或者后置--,都是让操作数自减1的
前置++:先+1,后使用
后置++:先使用,后+1
前置--:先-1,后使用
后置--:先使用,后-1