1.标识符:由字母和下划线和数字组成(不包括空格)组成,只能由字母和下划线开头 。例如: (4zy),(4wj),(4zwj),(4zy 4wj) 都是错误的 。
2.字符串常量所占的内存字节长度为字符中字节个数加1,因为字符串是以\0结尾,这是字符串结束的标志。
3.运算符的优先级:!> 算术运算符>关系运算符>&&>||>赋值运算符。同时记住:取余运算符只能用于两整数运算。
4.&&与||运算符易错警示:表达式1&&表达式2,只有表达式1的值不为0,才会进行表达式2的运算。 表达式1||表达式2,只有表达式1的值为0,才会进行表达式2的运算,也就是说表达式1的值为1时,不进行表达式2的运算。例如:int a=4,b=5,c=3,d=6,m=1,n=1; (m=a>b)&&(n=c>d); 输出m和n,结果是m=0,n=1
5.逗号运算符和表达式是我们特别要注意的。表达式1,表达式2 先求表达式1,再求表达式2,但整个逗号表达式的值是表达式2的值。例如:int a=2; int c=(a*2,a+10),a*5; 输出a和c的值,a等于2,c等于10
6.强制类型转换格式:(类型)(表达式),只是创造一个中间类型转换,得到中间变量,强制转换后各自类型都不变。
7.三种基本程序语句:顺序结构、选择结构、循环结构。还有一些学校喜欢考这个,给大家混个眼熟。
8.选择语句,无非就是一些if 与else 的问题,比较简单,这里不进行赘述。还有一个switch语句,初学者容易把switch()括号里放入非整数,这是错误的,括号里面只能放整型变量,还有break一定记得加。给个例子,问题:输入年月,求该年月有多少天:
#include<stdio.h>
int main()
{
int years,months,days,temp;
printf("请输入年月日:");
scanf("%d %d",&years,&months);
if(years%400==0)
{
temp=1;
}
if(years%4==0&&years%100!=0) //能被400整除或者能被4整除而且不能被100整除的是闰年 29天
{
temp=1;
}
else temp=0;
switch(months)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:days=31;break;
case 2:
{
if(temp=1) days=29;
else days=28;
}
break;
case 4:days=30;break;
case 6:
case 9:
case 11:days=30;break;
default:printf("month input error \n");
}
printf("%d年%d月有%d天",years,months,days);
return 0;
}
9.循环语句分为四个语句,while与do while与 for,知道do while 与while 区别是前面的必须要执行一次就行 。for循环则应用比较广泛,就讲一点吧,那个括号里的第三个表达式,可以放到for循环语句内部,可以自己定义条件。曾经博主就遇到这样一道题。
熟悉一下break和continue吧,记住break是跳出循环,提前结束整个循环语句,而且break只能在循环语句和switch语句中使用。而continue是结束本次循环,而且不执行下面未执行的语句,而是接着进行下一次循环。
10.函数来讲讲递归调用吧,递归嘛就是“有递有归”,就是有去有回的意思,数学模型是数学归纳法,找出问题相同的解法,不断直接或间接调用自己函数体本身,最后找到结束条件,在该条件下能够直接返回值的表达式
11. 函数问题我们还需要注意的就是传参问题,理解实参和形参,传数组和指针怎么去传,讲讲传数组和指针吧,下面给两个比较简单的例子吧。问题一,输入五个数,并进行排序。问题二,输入两个数并交换。
#include<iostream>
using namespace std;
#define N 5
void sort(int arry[],int n) //这里用选择排序吧,接地气
{
int temp;
for(int i=0;i<n;i++)
{
temp=i;
for(int j=i+1;j<n;j++)
{
if(arry[i]>arry[j])
{
temp=j;
}
}
if(temp!=i)
{
int t=arry[temp];
arry[temp]=arry[i];
arry[i]=t;
}
}
}
int main()
{
int arry[N];
for(int i=0;i<N;i++)
{
scanf("%d",&arry[i]);
}
sort(arry,N);
for(int i=0;i<N;i++)
{
cout<<arry[i]<<" ";
}
}
#include<stdio.h>
int swap(int* x,int* y)
{
int temp=*x;
*x=*y;
*y=temp;
return (*x,*y);
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
swap(&a,&b);
printf("%d %d",a,b);
return 0;
}
12.对了,还有带参的宏定义。直接拿例子讲讲吧。针对此问题把式子列出来就行了,如下为sum=m+n+m+n*y,🆗,搞定。
#include<iostream>
using namespace std;
#define M(x) x+x
int main()
{
int m=1,n=2,y=4;
int sum=M(m+n)*y;
cout<<sum;
return 0;
}
13.到数组了,记得数组名是数组首地址, 再注意输入数据就行了。
int a[10];
scanf("%d",a);
scanf("%d",&a[0]); //这两种方法等效
for(int i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
14.字符串赋值,大家想想,为什么[]里的数字不同呢?大家可以在评论区讨论。
char ch[3]={'d','c','b'};
char cj[4]={"dcb"};
char ck[4]="dcb";
15.字符串输入,输出函数的使用,为什么要用这个呢?因为scanf遇到空格就会结束,所以可以使用他们来解决这个问题。
char ch[3];
gets(ch);
puts(ch);
char cg[3]="ab";
puts(cg);
16. 指针的话记得&与*的使用,来讲讲指针与数组
int arry[3]={2,3,4};
int *p=arry;
for(int i=0;i<3;i++)
{
printf("%d\n",arry[i]);
printf("%d\n",*(p+i)); //等价
}
17.讲下*p++与*(p++)是等价的,因为++与*的优先级相同,结合方向为自右向左。作用是:先得到p指向的变量的值,再使指针变量p的值加1。
18.指针与二维数组:
int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
int (*p)[3]=a;
int *q=a;
//这两个应该怎么找a[1][[2]
a[1][2]=*(*(p+1)+2); //因为指针变量p是指向具有3个int型元素的一维数组
a[1][2]=*(*(q+1*4)+2); //对比一下就很好理解啦
//公式:
a[i][j]=*(*(p+i)+j);
a[i][j]=*(*(q+i*4)+j);
19.讲下字符指针和字符数组区别:前者可改变指向不同的字符串,后者是用来保存数据的。
20.字符数组和整型数组的赋值不能这样做:
char ch[5];
ch="abcde";
int a[5];
a[5]={1,2,3,4,5};
最后讲讲制转化吧
首先总结出两种规律:
1.十进制数->二进制,八进制,十六进制,相同的做法就是除二,除八,除十六,取余,但,是从最后一个读取到第一个
2.二进制,八进制,十六进制->十进制,相同的做法就是从最后一个数开始乘以二,八,十六的0次方到第一个数乘以二的n次方 ,再全部加起来,即得到十进制数
编程中我们常常使用这样的思想将十进制作为一个中间转化点,可以有效避免许多不必要的麻烦,掌握其上应该对进制转换是没有问题的了
但我们还是要了解一下二,八,十六进制之间的转换
3.二进制->八进制,十六进制,都是从右到左取数,但原本的顺序不变,一个是取三位,一个是取四位,不足的话补0,一样从取出来的位数开始,按照从最后一个数开始乘以二的0次方到第一个数乘以二的n次方,但最后不是加起来,而是直接连起来!
4.八进制,十六进制->二进制,对八进制和十六进制每一位进行,除二取余,同样对比上述每一位数都对应其分别有三个,四个二进制,不足时在最左边补0