大家好,我是Michael_cmr(一位蒟蒻)
今天给大家讲解——如何使用变量。
来吧!上节课已经说了大概的变量类型。现在开始使用变量
1.赋值操作(基本操作)
赋值操作就是给变量赋值。来,咱们上代码!
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
a=1,b=2,c=3;
cout<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
a=50,c=8884,b=454;
cout<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
a=b=c;
cout<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
system("pause");
return 0;
}
很好,让我们一起来分析一下这段代码。
首先,我们给整形变量a,b,c赋了初值,运用了 = 号,
然后输出了
接着,我们又给了它们三个新的值——
于是:
我们发现,我们后面给予它们的数值覆盖了前面的值。
最后,我们写了一个语句“a=b=c”
这句话什么意思呢?
就是说,把 c 的数值赋给 b 然后再给 a 。
注意我的语序是c->b->a 的,所以,可以得出赋值语句是从右往左赋值的。
来个例子证明一下
还是定义a,b,c;
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
a=20;
b=30;
c=b; //此处c的值应该为b,也就是30,尝试输出一下
cout<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
b=a; //此处b的值应该为a,也就是20,尝试输出一下
cout<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
system("pause");
return 0;
}
结果与注释当中预料的一模一样。所以要注意,在C++当中 a=b 和 b=a 是两个完全不同的语句。
让我们来一道题目体会一下:
题目:我们有整形变量a和b,现在要交换它们的值。
分析:假设我买了一瓶82年的雪碧和一瓶92年的可乐,现在要把可乐装进雪碧瓶里,然后把雪碧装进可乐瓶里。可以想象,除非我们有超能力,不然是不可能直接交换两个饮料的。
于是,我们就想到了——我们再花3个亿买下一个72年的空瓶子,然后把雪碧到进去(这时我们就的可乐瓶就空了),然后再把3亿的空瓶子里的雪碧到到可乐瓶里————任务完成(成功AC)
代码实现
#include<iostream>
using namespace std;
int main()
{
int a,b,c; //a是可乐,b是雪碧,c是空瓶子
a=200; //可乐有200ml
b=300; //雪碧有300ml
cout<<"a"<<a<<" b"<<b<<endl; //先输出一下初始值
c=a; //把可乐倒进空瓶里
a=b; //把雪碧倒进可乐瓶里
b=c; //把空瓶里的可乐倒进雪碧瓶里
cout<<"a"<<a<<" b"<<b<<endl; //输出交换后的值
system("pause");
return 0;
}
运行结果
可以看出,我们三亿元的空瓶产生了非常大的作用。
很好,细细品味一下——是不是醉了(毕竟是82年的东西)
哈哈~,我们继续来看其他的数据类型操作
精度(就是有小数)的操作
嘻嘻~,习惯性的——咱先上代码
#include<iostream>
using namespace std;
int main()
{
float a; //又是a,大家可能有点讨厌它们了
a=3.1415926;
cout<<a<<endl;
system("pause");
return 0;
}
运行结果:
大家发现我们的a明明是3.1415926。但是输出的却只有3.14159。
这是为什么呢?
就是cout输出语句自动判断的输出精度(一般都是5位),如果要保留2位小数的话(只是举个例子),那么,就要加入一些厉害的东西,请看:
#include<iostream>
#include<iomanip> //加入的头文件
using namespace std;
int main()
{
float a;
a=3.1415926;
cout<<fixed<<setprecision(2)<<a<<endl; //setprecision(2)意思是留2位有小数注意前面要加入fixed
system("pause");
return 0;
}
运行结果:
结合注释,你应该就知道了cout处理精度是有多么麻烦了吧?
没事,我们末尾有大彩蛋,不急,先往下看——
字符的操作:
#include<iostream>
using namespace std;
int main()
{
char a,b;
a=65;
b='A';
cout<<"a="<<a<<" b="<<b<<endl;
system("pause");
return 0;
}
运行结果:
我们发现,字符型变量 a 的数值是65,而我们给 b 赋值是字符 ‘A’ 。然而它们的输出却是一样的。
这是为什么呢?
这就涉及到了ASICC码表。(附图一张)
这个就是常用的ASICC码表。
所以就可以得知,我们给 char (字符型)赋值的时候有两种方式:
1.单引号中间加上字符 如:‘q’
2.直接写ASICC码表的数值 如:87(就等于赋值了‘W’)
但是,有时候,我们会想要输出的是我们字符变量的ASICC码值怎么办呢?
这是,就有一种叫做强制类型转换的东西。来咱上代码
#include<iostream>
using namespace std;
int main()
{
char a,b;
a=65;
b='A';
cout<<"a="<<(int)a<<" b="<<(int)b<<endl;
system("pause");
return 0;
}
运行结果:
不难看出,我们在输出的时候加上了一句(int)这点代码。这是什么意思呢?
这个就是我们传说中的强制类型转换:本来他们要输出的是字符A,但是我们把字符A转换成了int(整形),所以,输出的就是一个整数65(A的ASICC码)。
当然,强制类型转换不知这一点用处,再来一个例子:
我们有int 类型的a=214748364,还有b=999999999
然后输出a+b的和2。
分析:这个时候,很明显a+b超过了int类型范围。
所以,有两个思路:
1.定义long long 类型的c来存储a+b的和2。
代码实现:
#include<iostream>
using namespace std;
int main()
{
int a=214748364,b=999999999;
long long c=(a+b)*2;
cout<<c<<endl;
system("pause");
return 0;
}
运行结果:
我们发现,答案是错误的。哎~很奇怪,这是为什么呢?
原因:因为 a 和 b 都是int类型,所以它的运行结果(就是两数相加)也是int 类型,所以数据的溢出导致结果出错。
于是——第二种想法,强制转换类型:
代码实现:
#include<iostream>
using namespace std;
int main()
{
int a=214748364,b=999999999;
long long c=(long long)(a+b)*2;
cout<<c<<endl;
system("pause");
return 0;
}
运行结果
发现,这次就是对的了。
原理:我们把 (a+b)*2的值强制转换成了long long类型,于是——答案正确!
从这道题我们可以看出,编译器会自动转换数据类型。
还记得前面我们将运算符的时候
8/7=1
这道题吗?
现在用数据类型的眼光来看待这个算式
8和7都是整形变量。所以,两数相除的结果也是整数——1;
然而,根据数据类型转换,我们又可以得出:
#include<iostream>
using namespace std;
int main()
{
cout<<8.0/7.0<<endl;
system("pause");
return 0;
}
运行结果:
我们就发现这个时候小数就出来了。这是通过编译器的自动转换数据类型得到的
我们用强制转换数据类型也可以得到同样效果:
#include<iostream>
using namespace std;
int main()
{
cout<<(float)8/7<<endl;
system("pause");
return 0;
}
运行结果:
发现与刚刚是一样的。所以————自己体悟一下,这个还是比较重要的东西。
接下来——还有厉害的复合赋值表达符——就是说有两个(或以上)字符组成的运算符(包含复合算术赋值和复合位运算赋值)共11种。
先来简单好理解的复合算术运算符吧
#include<iostream>
using namespace std;
int main()
{
int a=50;
a-=2;
cout<<a<<endl;
a+=4;
cout<<a<<endl;
system("pause");
return 0;
}
运行结果:
这里我们就运用了复合算术赋值符,来给 a 进行加或减。-= 和+=还有其他说有的复合赋值表达式的含义都可以理解为 a = a + x ——这里的加号是模拟我们要用的运算符(比如乘除加减取模都可以代替),然后x表示我们的一个常数项,就比如我们a+=4 里面,x就是其中的4。以此类推………………
我们还有(*= /= %=………………【还有以后要讲到的位运算】)。
接下来,还有最后一块内容
变量的自增和自减
定义:所有类型的变量的值加或减 1 的时候,都可以写作:
变量名++ 或者 ++变量名
变量名- - 或者 - -变量名
当然,既然运算符的位置不一样,那么它们也不会像我们想先的那么简单。让我们来一段代码领悟一下它们的不同:
#include<iostream>
using namespace std;
int main()
{
int a=50;
cout<<a<<endl; //尝试输出a的初始值
a++;
cout<<a<<endl; //a++后的值
int b=50;
cout<<b<<endl; //尝试输出b的初始值
++b;
cout<<b<<endl; //++b后的值
system("pause");
return 0;
}
运行结果:
貌似没有区别是吧? 这是因为在单独的自增和自减中,它们的结果是一样的。但是——
#include<iostream>
using namespace std;
int main()
{
int a,b;
a=b=50; //先给他们赋初值50
cout<<"a="<<a<<" b="<<b<<endl;
a=b++;
cout<<"a="<<a<<" b="<<b<<endl;
system("pause");
return 0;
}
运行结果:
是不是就出现了不同?原因是我们的编译器在执行 a = b + + 这行代码的时候,是先将 b 的值赋给 a 然后 b 在自增 1 。
所以 a 的值跟 b 就不一样了
如果我们换一种写法呢?
运行结果:
这时,a 就跟 b 是一样的了,因为这一次的 a = + + b ,这个语句是先+ + b(b先自增 1),然后再把b 的值赋给 a 所以两个变量的数值就一样了。
自减(- - )的用法跟自加(++)的用法是一样的,这里就不多说。
好了~,让我们一起进入彩蛋部分吧!!!
3.彩蛋
这个彩蛋其实也没什么,就是给大家介绍我们的新成员——printf
printf 是C语言的标准输出,对于输出还是很友好的(比cout简单),但是也有一些复杂的地方。现在就让我来为大家一一讲解:
首先,这个函数的头文件是——
#include< cstdio>(C++风格的头) 或者
#include< stdio.h> (C风格的头)
既然是C语言的标准输入输出,那么,我们就可以省略掉
using namespace std;
这一句话,是不是感觉瞬间少写了很多东西?
嘻嘻~抱着这种想法,我们继续往下——
如何使用printf 语句
举例子:
#include<cstdio>
#include<cstdlib> //包含了system("pause")
int main()
{
int a=20;
printf("a=%d",a);
float b=3.1415;
printf("保留2位小数的b=%.2f",b);
printf("保留3位小数的b=%.3f",b);
system("pause");
return 0;
}
运行结果:
发现它们是不是黏在了一行?
我们加一个‘\n’在里面就好了——‘\n’表示的意思是换行,等同于cout里面的endl。
我们加进去看一下
#include<cstdio>
#include<cstdlib> //包含了system("pause")
int main()
{
int a=20;
printf("a=%d\n",a);
float b=3.1415;
printf("保留2位小数的b=%.2f\n",b);
printf("保留3位小数的b=%.3f\n",b);
system("pause");
return 0;
}
运行结果:
是不是达到了换行的效果?
接下来让我们一起系统的学习printf语句
我们发现,printf后面有个括号,括号里面就是我们要输出的内容。
接着,括号里面有个双引号是吧?这个双引号里面的除格式符外的所有字符(包括中文)直接输出——看到这里,大家是不是有点懵,格式符是啥?
格式符就是我们写的%d啊%f啊之类的
列一个表格来写出所有的格式符
(省略百分号)
格式字符 意义
d 以十进制形式输出带符号整数(整数不输出符号)
o 以八进制形式输出无符号整数(不输出前缀0)
x,X 以十六进制形式输出无符号整数(不输出前缀0x)
u 以十进制形式输出无符号整数
f,lf 以小数形式输出单、双精度实数
e,E 以指数形式输出单、双精度实数
c 输出单个字符
s 输出字符串
在输出小数(f,lf)的时候,我们可以在%与f或lf之间加上一个 . 然后加上一个数字n,表示输出小数点后 n 位。
请原谅,以后的blog 中,我就将用printf语句作为输出语句来给大家讲解(根据多年的经验printf语句比cout快),希望大家能够掌握这个语句!谢谢!如有出错,多多包涵(如能指出,感激不尽)!谢谢大家!欢迎各位大神指点!
(转载请标注出处与楼主姓名)
(QQ:2437844684)
(欢迎各位大神评论)