在使用cin和cout时,要在源文件最上方加上#include
分为单行注释和多行注释:
定义为数据类型+变量名+赋初值
定义方式有两种
x1#defineday723intmain()4{5constintmonth=12;//const定义的常量6}两种定义的常量都是不能被修改的,否则会报错。
在给变量和常量起名字时,不要用关键字作变量名。
给变量起名字时,最好做到见名知意。
如果超出范围会发生一些有意思的事,比如:shorta=32768;实际上a打印出来为-32768,从上限反转到下限。
其中int最为常用。
sizeof(数据类型/变量),返回是字节数
分为float和double,单精度占4个字节、双精度占8个字节,区别就是有效数字位数不同,不管是单精度还是双精度在打印时只显示6位有效数字
科学计数法:3e2意思是3*10^2=300,e之后的数字表示10的多少次方。
字符型变量占用1个字节空间,字符型变量并不是把字符本身放到内存中去存储,而是将对应的ASCII编码放入存储单元,想要打印ASCII的值可以用(int)a来转换。可以直接用ASCII给字符型变量赋值如:ch=97;
常见的一些错误如下:
常用的几个如下:
两种风格
bool类型只占用一个字节的空间,只有两个值true或false本质分别为1和0。
主要语法用到cin>>变量,cin可以为整型、浮点型、字符型,字符串型、bool型(只要是输入非0的值,都会赋值成1)赋值。
加减乘除,应当注意的是除法运算,两个整型数相除结果依然是整型,0不能作除数否则报错。
取模运算即取余数使用%,应当注意的是0不能作为取余运算的右操作数,且两个小数不能作取余运算。
前置递增和后置递增,都可以让变量加1,但是它们的区别是:前置递增是先让变量+1,再进行表达式的运算,后置递增是先进行表达式的运算,再让变量+1。前置递减和后置递减也是同样的道理。
举例如下:
xxxxxxxxxx81inta=10;23a=100;//普通赋值4a+=2;//等价于a=a+25a-=3;//等价于a=a-36a*=4;//等价于a=a*47a/=5;//等价于a=a/58a%=6;//等价于a=a%63.3比较运算符主要有大于、小于、等于、不等于、大于等于、小于等于。比较运算表达式的结果为0或1,0代表逻辑false,1代表逻辑true。
注意:
xxxxxxxxxx31//有个优先级问题2inta=10,b=20;3cout<<(a==b)< 1.单行if语句,语法如下: xxxxxxxxxx41if(条件)2{3要执行的语句4}注意的是if(条件)后面不要加分号,否则不管条件满足与否都会执行后面语句。 2.多行if语句,语法如下: xxxxxxxxxx81if(条件)2{3条件满足下要执行的语句4}5else6{7条件不满足要执行的语句8}3.多条件的if语句,语法如下: xxxxxxxxxx161if(条件1)2{3条件1满足要执行的语句4}5elseif(条件2)6{7条件1不满足,但条件2满足要执行的语句8}9elseif(条件3)10{11条件1不满足、条件2不满足,但条件3满足要执行的语句12}13else14{15以上条件都不满足要执行的语句16}4.此外if语句还支持嵌套,让条件判断更加精细 语法为:表达式1表达式2:表达式3; 如果表达式1的值为真,执行表达式2,并返回表达式2的结果;如果表达式1的值为假,执行表达式3,并返回表达式3的结果。在C++中三目运算符返回的是变量,可以继续赋值,举例如下: xxxxxxxxxx71inta=10;2intb=20;3intc=0;45c=(a>ba:b);//相当于c=b67(a>ba:b)=100;//在C++中三目运算符返回的是变量,可以继续赋值,执行后a的值为10,b的值为100通过上面例子可以知道,三目运算符表达式既可以作左值也可以作右值。 语法如下: xxxxxxxxxx71switch(表达式)2{3case1:执行语句1;break;4case2:执行语句2;break;5……6default:执行语句;break;7}case里面如果不写break程序会一直向下执行 与if的区别: 语法:while(循环条件){循环语句} 只要循环条件为真,就一直执行循环内的语句,要检查是否有跳出循环的出口,除非有的时候我们确实需要死循环。 做一个猜数字的案例,随机生成一个1到100的随机数,让玩家去猜,每次猜系统要提示玩家大了小了,直到玩家猜对为止,游戏结束。 生成一个1到100的随机数,代码为: 与while循环语句不同的是dowhile至少保证代码执行一次。 可以写一个水仙花数案例,找出所有的水仙花数,水仙花数是指一个三位数,它各位数字的三次幂之和等于它本身的数。 语法:for(起始表达式;条件表达式;末尾循环体){循环语句} 注意for循环中的表达式要用分号分隔 可以尝试打印9*9乘法表 用于 用于在循环语句中,跳过本次循环中余下的未执行语句,继续执行下一次循环。例如可以充当一个筛选条件,打印0到100之间所有的奇数。 可以无条件的跳转代码,语法是goto标记;这个标记一般用大写的单词来定义,例如:FLAG。在所需要跳转到地方写一个FLAG:然后当程序执行到goto语句的时候就能实现跳转。不过由于goto语句过于强大,不推荐使用,容易造成程序流程混乱。示例如下: xxxxxxxxxx111intmain()2{3cout<<"1"< 一维数组定义的三种方式 1.数据类型数组名[数组长度]; 2.数据类型数组名[数组长度]={值1,值2……};定义的时候赋初值,如果初始化的时候没有全部填写完会用0来填充剩余的数据比如: xxxxxxxxxx11intarr[5]={10,20,30};//那么arr[3]和arr[4]就都为0了3.数据类型数组名[]={值1,值2……};初始化几个值,数组长度就为几,不允许不赋值如:intarr[];错误! 需要注意的是一旦采用第一种方式,后面就不能群体赋值了 一维数组名称的用途: xxxxxxxxxx41cout<<"数组首地址为:"< 冒泡排序是一个比较重要的排序算法,下面为升序的冒泡排序代码: xxxxxxxxxx181//对一个已知的数组arr做冒泡排序2inti,j,temp;3intlen;4len=sizeof(arr)/sizeof(arr[0]);56//开始冒泡排序,i表示轮数,从第0轮开始一直到第(len-2)轮,第i轮需要进行(len-i-1)次比较7for(i=0;i 这里比较推荐第二种定义方式,直观简单。 查看二维数组所占内存空间。可以统计整个数组在内存中的大小sizeof(数组名);,返回结果为字节数。如果要看每一行占用的大小代码为sizeof(数组名[0]);,如果要看每一个元素占用内存的大小代码为sizeof(数组名[0][0])。 计算二维数组行数代码为sizeof(数组名)/sizeof(数组名[0]);,计算二维数组元素个数代码为sizeof(数组名)/sizeof(数组名[0][0]); 获取二维数组首地址。示例如下: xxxxxxxxxx51cout<<"数组首地址为:"< 在存储人名的时候可以用一个字符串数组,如下: xxxxxxxxxx31#include xxxxxxxxxx61返回值类型函数名(参数列表)2{3函数体语句;45return表达式;6}6.3函数的调用语法为:函数名(参数); 值传递的时候,形参发生任何改变都不会影响实参。可以从内存分配的角度来理解。 常见有四种类型: 步骤为: 注意:在上述的源文件中,开头要写#include"头文件名.h"这个就代表了头文件和源文件它俩之间是配套的(即有关联的);在上述的头文件中,要包含源文件用到的一些标准库,比如源文件中用到cout、cin,那么头文件开头就要写#include 指针的作用:可以通过指针间接访问内存 指针变量定义的语法为:数据类型*变量名;下面为示例: xxxxxxxxxx101inta=10;2int*p;//指针的定义3p=&a;//指针变量赋值,也可以定义时一步搞定int*p=&a;45cout<<"变量a的地址为:"<<&a< 空指针作用:用于给指针变量进行初始化,空指针是不可以进行访问的,空指针NULL是0值,而0到255之间的内存编号是系统占用的,因此不可以访问。 野指针:指向非法的内存空间,示例如下: xxxxxxxxxx21int*p=(int*)0x1100;//将一个十六进制数强转为地址2cout<<*p< 分为以下三种: const修饰指针---常量指针 定义为:constint*p=&a; 特点是:指针的指向可以修改,但是指针指向的值不可以改。*p=20;错误。p=&b;正确。 const修饰常量---指针常量 定义为:int*constp=&a; 特点是:指针的指向不可以修改,但是指针指向的值可以改。*p=20;正确。p=&b;错误。 const既修饰常量又修饰指针 定义为:constint*constp=&a; 特点是:指针的指向和其指向的值都不可以修改。*p=20;和p=&b;均错误。 利用指针来访问数组中的元素,下面为用指针遍历数组的示例代码: xxxxxxxxxx91intarr[10]={1,2,3,4,5,6,7,8,9,10};2inti;3int*p=arr;45for(i=0;i<10;i++)6{7cout<<*p< xxxxxxxxxx231voidswap1(inta,intb)//值传递不会改变实参2{3inttemp=a;4a=b;5b=temp;6}78voidswap2(int*p1,int*p2)//地址传递会改变实参9{10inttemp=*p1;11*p1=*p2;12*p2=temp;13}1415intmain()16{17inta=10,b=20;18swap1(a,b);19cout<<"a和b的值分别为:"< 做一个综合案例,封装一个函数,利用冒泡排序实现对一个数组的升序排序。数组为intarr[10]={4,3,6,9,1,2,10,8,7,5}; xxxxxxxxxx361voidbubbleSort(int*arr,intlen)2{3inti,j,temp;4for(i=0;i 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。 语法:struct结构体名{结构体成员列表}; 通过结构体创建变量的方式有三种: xxxxxxxxxx181structstudent2{3stringname;4intage;5intscore;6}s3;//第三种创建方式,定义结构体时顺便创建变量,之后像第一种一样利用.来对其属性赋值78intmain()9{10//第一种创建方式,之后想要赋值就要用.来访问其属性11structstudents1;//这里可以省去struct,但是在结构体定义时struct不能省12s1.name="张三";13s1.age=18;14s1.score=90;1516//第二种创建方式,创建时就赋初值17structstudents2={"李四",19,95};18}8.3结构体数组语法:struct结构体名数组名[元素个数]={{},{}……}; 结构体数组与其他数组一样,可以在创建的时候赋初值,也可以只创建,之后用.号来赋属性的值。 利用操作符->可以通过结构体指针访问结构体属性。 xxxxxxxxxx41structstudents={"张三",18,90};2structstudent*p=&s;34p->name="李四";//与其他数据类型的指针不同8.5结构体嵌套结构体在结构体中可以定义另一个结构体作为成员,形成结构体嵌套结构体。 xxxxxxxxxx161structteacher2{3stringname;4intage;5structstudentstu;6};78intmain()9{10structteachert;11t.name="老王";12t.age="30";13t.stu.name="小王";14t.stu.age=18;15t.stu.score=90;//利用多个.号访问作为成员的结构体的属性16}8.6结构体作函数参数将结构体作为参数向函数中传递,传递方式有两种: 比如说,向子函数传一个学生的结构体,要求子函数打印学生的信息,代码如下: xxxxxxxxxx191voidprintstu1(structstudents)2{3//s.name="李四";回到main函数在,实参值不变,还为原来4cout<<"学生姓名:"< 作用:用const来限定只读操作,防止误修改 应用场景的产生:在向子函数传递一个结构体时,如果采用值传递,那么会在子函数中复制出一个新的副本,当结构体十分庞大时会占用比较多的内存资源,所以我们采用地址传递(只传入地址4个字节节省内存空间),但是地址传递可以修改实参的值,容易造成误修改。此时就有了使用const的必要,加入const之后一旦有修改的操作就会报错,可以防止误操作。 xxxxxxxxxx121voidprintstu(conststructstudent*p)2{3//p->age=20;加了const后这句代码就会报错,从而避免了实参值的误修改