1.常量分类:字面常量 const修饰的常变量 #define定义的标识符常量 枚举常量
2.字面常量:直接写出的常量
3.const修饰的常变量(为变量但具有常属性):const=常属性,在int等前加上const即可使其后变量变为“常量”,如:
int main()
{
const int num = 1;
return 0;
}
虽然此时num已经成为”常量“,但不可在只可使用常量的地方使用num,如:
int main()
{
const int num = 1;
int arr[num] = {0};
return 0;
}
此段代码即为错误的
4.#define定义的标识符常量:用#define定义的标识符常量可用于只可使用常量的地方,定义时其后不加“;”,如:
#define MAX 10
int main()
{
int arr[MAX] = {0};
return 0;
}
5.枚举常量:枚举关键字为enum
enum Sex
{
MALE,
FEMALE,
};
int main()
{
enum Sex s = MALE;
s = FEMALE;
MALE = 3;
printf("%d\n", MALE);
printf("%d\n", FEMALE);
return 0;
}
其中MALE与FEMALE为枚举常量,s为某人真的性别,其后的MALE为给s赋的值,运行后,MALE与FEMALE的可被打印出来,对应0与1,不可更改,是常量,但枚举类型创造的变量是可以更改的,即在上段代码中s=FEMALE是正确的,而MALE=3是错误的。
PS:若用int更改上面的MALE,实质上是创造了一个局部变量(优先级大),printf就打印出变量的值
6.字符串:由双引号引起的就是字符串(由单引号引起的是字符),如:“abcdef”就是字符串,“”为空字符串,打印字符串用%s
int main()
{
char arr1[] = "abc";
char arr2[] = {'a','b','c'};
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
其中arr1能正确打印出abc,而arr2不能正确打印abc,原因:“abc”=‘a’,‘b’,‘c',’\0‘,\0是字符串结束的标志,所以若想arr2正确打印,需要加上0或者‘\0’(\0在ASCLL表上表示的值是0),如下:
char arr2[] = {'a','b','c',0};
char arr2[] = {'a','b','c','\0'};
计算字符串长度用strlen(),如下:
int main()
{
char arr1[] = "abc";
char arr2[] = {'a','b','c'};
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
return 0;
}
其中arr2的长度是随机值,因为没有\0,就会继续向后计算,知道碰到\0
PS:上段代码会出现警告,使用strlen时需要在主函数前加上#include
7.转义字符:
int main()
{
printf("abc");-----------1
printf("abcn");----------2
printf("abc\n");---------3
return 0;
}
上面的代码中,1号会打印abc,2号打印abcn,3号打印abc,而1号与3号区别是换行,则“\”有转义字符的作用,让某个字符不再是原本有的意思。
\v为水平制表符
\n表示换行
\t表示水平制表符(即为Tab)
\?在书写时防止被解析为三字母词
\\表示一个\
\ddd表示八进制数转化为十进制数后所对应的ASCLL码值(ddd表示1~3个八进制数字)
\xdd表示十六进制数转化为十进制数后所对应的ASCLL码值(dd表示十六进制数)
ASCLL表码值(字符--->表值):0--->48 9--->57
A--->65 Z--->90
a--->97 z--->122
8.注释:代码中有不需要的可直接删除或注释掉;代码过于复杂,可在其旁注释
//代码 可注释掉当前行//后的代码
/*代码*/ 可注释掉两个*中所有代码
Ctrl+K+C 注释掉所选代码 Ctrl+K+U 取消注释掉所选代码
9.条件语句:格式如下:
int main()
{
int input = 0;
printf("are you study carefully?(1/0)>:");
scanf("%d", &input);
if (input == 1)
{
printf("I will give you NS");
}
else
{
printf("I will beat you");
}
return 0;
}
10.循环语句:while语句,for语句,do...while语句
while语句格式如下:
int main()
{
int line = 0;
printf("Become programmer\n");
while (line<20000)
{
printf("Type a line of code %d\n", line);
line ++;
}
printf("You get the telephone microwave(tentative)\n");
return 0;
}
其中line++就是line=line+1的意思,若删去++,则代码会不断运行,此时可以点击终端窗口,再按Ctrl+C来停止
11.函数:分自定义函数和库函数
自定义函数格式如下:
int Add(int a, int b)
{
int c = a + b;
return c;
}
Add叫函数名,()内是函数的参数,{}内写的是函数集,函数集是完成所给的任务,下图:
int main()
{
int num1 = 20;
int num2 = 79;
int sum = 0;
sum = Add(num1, num2);
printf("sum = %d\n", sum);
return 0;
}
即可调用自定义的Add函数(函数可以简化代码)
12.数组:一组相同类型的元素的集合
定义方式:int arr[10] = {...};
其中int为定义整型,arr为数组的名字,[ ]内的数字为数组中元素个数,{ }内写上元素,用“,”隔开。若定义元素为5的字符数组,即为char arr[5] = {...};
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//数组中元素对应下标,第n个元素的下标为n-1
int x = 0;
printf("%d\n", arr[4]); //第n个元素用arr[n-1]表示,即“数组名[n-1]”
printf("start\n");
while (x<10) //此段代码即可将数组中所有
{ //元素打印出来
printf("%d\t", arr[x]); //
x ++; //
} //
return 0;
}
13.操作符:
算术操作符:+ - * / % 对应 加 减 乘 除 取mu(取余数)
移位操作符:>> << 对应 右移 左移 (移的位是二进制位),如下:
int main()
{
int a = 1;
int b = a<<5; //或// a = a<<5;
printf("%d\n", b); //者// printf("%d\n", a);
return 0;
}
运行后得到32
位操作符:& 按位与 | 按位或 ^按位异或,例如:
int main()
{
int a = 3; //二进制为011
int b = 5; //二进制为101
int c = a&b; //按位与就是并在一起,只有同时为真才为真(0为假,非0为真)
printf("%d\n", c); //打印结果为1
return 0; //按位或:只要有一个为真即为真
} //按位异或:对应的二进制位相同即为0、二进制位相异即为1
赋值操作符:分为复合赋值符和赋值符(=)
复合赋值符:
int main()
{
int a = 10; //
a = a+10; //1 1与2等效
a += 10; //2
a = a-10; //3 3与4等效
a -=10; //4
a = a & 2; //5 5与6等效
a &= 2; //6
return 0; //
}
单目操作符 双目操作符 三目操作符:
int main()
{
int a = 10;
int b = 20;
a+b; //+左右有两个数,即为双目操作符
return 0;
}
单目操作符:!反逻辑操作符,假变真、真变假 sizeof操作数的类型长度(以字节为单位)
-负值 +正值(一般会省略) &取地址 ~对一个数的二进制按位取反
--前置、后置 ++前置、后置 (类型)强制类型转换 *间接访问操作符(解引用操作符)
一些单目操作符使用:
int main()
{
int a = 10;
printf("a=%d\n", !a); //0为假,非0为真
int b = -a;
int c = +a;
printf("a=%d\n", sizeof(a)); //sizeof可计算变量、类型、数组...大小
printf("int=%d\n", sizeof(int));
int arr[10] = {0};
int d = 0;
d = sizeof(arr)/sizeof(arr[0]); //sizeof也可计算数组元素个数
printf("d=%d\n", sizeof(d));
//~按位取反,0变1,1变0
int x = 0; //y是有符号的整型,最高位为1就是负数
int y = ~x; //按位取反后最高位变为1,负数在内存中储存时,
printf("y=%d\n", y); //储存的是补码,使用的、打印的是数的原码
//补码-1得到反码,原码按位取反得到反码
int w = 10;
int s = w++; //后置++:将w的值赋给s,w再+1
printf("w=%d s=%d\n", w, s);
int m = 10;
int n = ++m; //前置++:先让m+1,再将m的值赋给n
printf("m=%d n=%d\n", n, m); //前后置--用法与++相同
int z = (int)3.14; //()中放类型,将3.14强制转化为整型
printf("z=%d\n", z);
return 0;
}
PS:关于原码、反码、补码:只要是整数,内存中存储的都是二进制的补码。对于正数来说三码相同;负数也存补码。按照正负写出来的二进制数列即为原码,原码符号位(即最高位,最高位为1即为负数,为0即为正数)不变,其他位按位取反得到的就是反码,补码就是反码+1
关系操作符:>大于 >=大于等于 <小于 <=小于等于
!=用于测试"不等于" ==用于测试"等于"
逻辑操作符:&&逻辑与 ||逻辑或
int main()
{
int a = 5;
int b = 3;
int c = a && b; //当&&两边都为真,c才为真=1,c为假时=0
printf("c=%d\n", c);
int x = 4;
int y = 0;
int z = x || y; //当||两边都为假,z才为假=0,z为真时=1
printf("z=%d\n", z);
return 0;
}
条件操作符:exp1 ? exp2 : exp3(exp为表达式)(也是三目操作符)
int main()
{
int a = 10;
int b = 20;
int max = 0;
max = (a>b? a:b); //格式为exp1 ? exp2 : exp3 exp1为真,则执行exp2;
printf("max=%d\n", max); //exp1为假,则执行exp3
return 0;
}
逗号表达式:exp1,exp2,exp3,...
其他:下标引用[ ]、函数调用()、结构成员. 和 -> (下标引用参见数组,函数调用参见自定义函数)