1、整型常量
十进制数:eg:99
二进制数:eg:0b0110
八进制数:eg:076
十六进制数:eg:0x2134
2、浮点型常量
小数 1.123
指数 -0.00123 --> -1.23e^(-3)
3、字符常量 -- 单个字符,用''括起来
'a' 'A' '0' 'n' '+'
'141' --> 141(八进制) --> 97(十进制) --> 'a'
4、字符串常量 -- 一串字符,用" "括起来,以' '结束
"zhangsan" "张三" "028 - 7777777"
5、宏(宏只能大写) -- 标识常量
#define MAX 250
二、变量
定义一个变量:
<存储类型><数据类型><变量名/标识符>;
eg:(auto) int a;
1、存储类型 -- 想要把这个数据存到哪里去
4个存储类型:auto static extern register
注意:
1、在程序运行的时候,变量占据了一定大小的内存空间
2、变量存储空间的大小,由数据类型决定
3、变量的内存空间首地址,就是变量的地址
2、数据类型 -- 变量要装什么类型的数据(小数、字符、整数)
必须定义为相应的数据类型
变量的初始化:定义的时候赋值
int a = 10;
3、变量的分类
C语言中{}就是一个模块
(1)全局变量
定义的位置:在所有的模块外
有效范围:从定义开始,到整个程序结束
生命周期:从定义开始,到整个程序结束
特点:如果没有初始化,默认为0
(2)局部变量
定义的位置:在模块内部
有效范围:从定义开始,到整个模块结束
生命周期:从定义开始,到整个模块结束
特点:如果没有初始化,默认为0
三、存储类型
1、auto -- 自动类型(系统自动分配区域)
普通局部栈变量,这种对象会自动创建和销毁
一般隐藏auto的存储类型为自动存储类型,程序中大部分都是这种自动变量
int b = 1; ==> auto int b = 1;
2、register -- 寄存器类型
特点:提升运行效率,cpu上寄存器特别少
register float pi = 3.14;
可能会申请失败,失败后会自动转化为auto类型
3、extern - 引用、声明全局变量、函数等
(1)extern 可以在一个文件中去扩展全局变量的作用范围
eg:
#include
int Max(int ,int);
int main(int argc, char *argv[])
{
extern a,b;
scanf("%d %d",&a,&b);
printf("Max = %d",Max(a,b));
return 0;
}
int a,b;
int Max(int a,int b)
{
return (a > b)?a:b;
}
(2)将全局变量的作用范围扩展到其他文件
eg:
第一个文件夹demo.c:
int b = 2;
extern c = 5;
第二个文件夹main.c:
#include
extern b;
int c;
int main(int argc, char *argv[])
{
printf("b = %dn",b);
printf("c = %dn",c);
return 0;
}
(3)extern 修饰函数 此函数就成为了外部函数,可供其他文件调用
eg:
第一个文件fun1.c:
#include
void fun1()
{
printf("fun1.....n");
}
第二个文件fun2.c:
#include
extern void fun2()
{
printf("fun2.....n");
}
第三个文件main.c:
#include
extern void fun1();
void fun2();
int main(int argc, char *argv[])
{
fun1();
fun2();
return 0;
}
4、static -- 静态类型
数据存放在全局数据区,但作用域只能在本文件或本函数中使用
所以可以在两个不同文件 或 函数中,同时申明同名的两个static变量
但是它们两个是不同的变量
(1)修饰全局变量,将这个全局变量作用域限制在本文件中
(2)修饰函数,限制函数作用域只能在本文件中使用
(3)修饰局部变量,改变局部变量的生命周期 -- 一直到程序结束
#include
void test()
{
static int m = 1;
printf("m = %dn",m);
++m;
}
int main(int argc, char *argv[])
{
test();
test();
test();
return 0;
}
四、输入输出
1、格式输入输出函数
printf()
功能:按照指定的格式向显示器输出数据
格式:printf("格式控制串",输出表);
%d -- 十进制
%x -- 十六进制
%o -- 八进制
%c -- 打印字符
%s -- 打印字符串
%p -- 打印地址
%f -- 打印浮点数
%u -- 打印无符号int
%e -- 打印指数
scanf() -- 格式输入函数
功能:按照指定格式,从键盘读入数据存入到地址表中待定
格式:scanf("格式控制串",地址表);
注意:
1、遇到空格 TAB 回车代表结束
2、格式控制串里面有什么,就必须要输入什么符号
3、如果遇到非法输入也会结束
#include
int main(int argc, char *argv[])
{
int a,b,c;
int i;
i = scanf("%d %d %d",&a,&b,&c);
printf("%dn",i);
return 0;
}
2、字符输入输出函数
getchar() -- 从键盘读入一个字符(返回值是输入的那个字符)
用法:
char ch;
ch = getchar();
putchar() -- 在终端打印一个字符
putchar(ch);
putchar('a');
putchar('n');
3、字符串输入输出函数
gets() -- 输入
gets(字符串存入的首地址);
只是以回车作为输入结束
puts() -- 输出
puts(字符串的首地址)
会自动换行
char a[20] = {0};
gets(a);
puts(a);
#include
int main(int argc, char *argv[])
{
char a[20];
#if 0
scanf("%s",a);
printf("%s",a);
#else
gets(a);
puts(a);
#endif
return 0;
}
五、数据类型的转换
1、显式转换 -- 强制性转换(使用空类型指针必须强转)
(int)a
(void *)p
eg:
int main()
{
int sum = 17,count = 5;
double mean;
mean = (double)sum / count;
printf("%dn",sum);
printf("mean = %fn",mean);
return 0;
}
注意:
(1)强制性转换后面的表达式比较复杂,一定要注意使用小括号
(2)强制性转换是一种不安全的转换,一般都是高级的转换成低级的,所以会导致数据丢失
(3)强制性转换不能实际的去改变变量的 值 和 数据类型
2、隐式转换 -- 自动转换
char short --> int --> unsigned --> long --> double <-- float
有符号与无符号 --> 都转换为无符号
隐式转换有三种类型:算术转换、赋值转换、输出转换
(1)算术转换:必须要转换成同一个类型才能运算,在进行运算的过程中,以表达式中最长的类型为主,其他类型都会转换成该类型
char ch;
int i,result;
float f;
double d;
result = ch / i + (f * d - i);
(2)赋值转换:等号右边的数据类型会自动转换为左边的数据类型
如果左边的数据类型比右边的小,则会导致数据的丢失,会进行截断
(3)输出转换:以printf为主,printf()以指定的格式输出,如果输出的数据类型与输出的格式不同,会自动转换
注意:
a.较长类型的数据转换成较短类型的数据输出,值不能超过较短类型允许的范围,否则就会出错
b.输出的数据类型 与 输出格式不符合时,经常发生错误
int d = 9;
printf("%fn",d);
#include
int main(int argc, char *argv[])
{
int a = 267;
int d = 27;
printf("%c",a);
printf("%fn",(float)d);
return 0;
}
六、取余 & 取模
对取余和取模定义不同的语言中,两者的不同点只有一个
- 取余运算在计算商值向0方向舍弃小数位
- 取模运算在计算商值向负无穷方向舍弃小数位
也就是:取余,遵循尽可能让商大的原则
取模,遵循尽可能让商小的原则
取余(rem)和取模(mod)在被除数、除数同号时,结果是等同的,异号时会有区别,所以要特别注意异号的情况
eg:
取模
5 mod 3 = 2 % 除数是正,余数就是正的
-5 mod 3 = 1
5 mod -3 = -1 % 除数是负,余数就是负
-5 mod -3 = -2
取余 % 用 rem 时,不管除数是正是负,余数的符号与被除数的符号相同
5 rem 3 = 2 % 被除数是正,余数就是正
5 rem -3 = 2
-5 rem 3 = -2 % 被除数是负, 余数就是负
-5 rem -3 = -2



