1.常量与变量:
1.常量:在程序运行中,其值不能被改变的量; 反过来说 错误;值不能修改就是常量
- 整型 100 125 -12 0;
- 实型 3.14 0.125 -3.7891
- 字符型 'a' 'b' '2' '0' '-1'
- 字符串 'ab' '1234' '-12332'
- 使用场合:表达式或赋值语句中;a=10+b; c=12.5
2.变量:系统根据变量的类型开辟对应的空间,其值可以被修改;
- int num=10; 变量名num代表的是空间的内容;操作变量名就是对空间内容的操作;
- 命名规则:由数字 字母 下划线组成,但不能以数字开头;第一个字符必须以字母或下划线开头;建议 小写单词+'_'组成
- 特点:变量在编译时为其分配相应的内存地址,可以通过名字和地址访问相应空间;
2. 整型常量的进制:二进制 八进制 十进制 十六进制
- 不同的进制仅仅是对同一个数据的表现形式,并不会修改数据本身;
int num=100;
八进制:0 ~ 7 %o printf("num=%#o\n",num); 以0开头 //0144
十进制:0 ~ 9 %d %u %ld %lu printf("num=%#d\n",num); //100
十六进制:0 ~ 9 a ~ f %x printf("num=%#x\n",num); 以0x开头 //0x64
- 不同进制之间的转换:
3.整型变量的操作——读(取值),写(赋值,赋值语句要保证=号两边类型相同)
eg: 案例分析
int 有符号输出 %d 无符号输出 %u;
float 有符号输出%f 无符号输出%fu; 7位有效数字,
double 有符号输出%lf 无符号输出%lfu;16位有效数字,
long 有符号输出 %ld 无符号输出 %lu;
short 有符号输出 %hd 无符号输出 %hu;
#include<stdio.h>
void test04()
{
int num01; //局部变量不初始化,内容随机
int num=100; //所以一定要定义一个初始值;赋值100
int data=0;
printf("num=%d\n",num); //读--取
data=num; //将num的值读取后赋值给data
int num1=0;
// %d 有符号int数据输出
printf("num1=%d\n",num1);
unsigned int num2=0;
// %u无符号int数据输出
printf("num2=%u\n",num2);
}
int main(int argc,char *argv[])
{
test04();
return 0;
}
4.实型(浮点型)常量:
1.错误:float f (4字节) = 3.14 ( 8字节); ( 3.14f 四字节) // 3.14 是const double
正确:float f=3.14f double d=3.14;
相当于将8升水倒入4升的杯子中,f 存在内存溢出问题; 应该对应的是3.14f 倒入;
#include<stdio.h>
void test01()
{
//以f 结尾的实型常量,为float类型,占4字节
printf("sizeof(3.14)=%d\n",sizeof(3.14f)); //4
//不以f结尾的实型常量,为double类型,占8字节
printf("sizeof(3.14)=A%d\n",sizeof(3.14)); // 8
}
int main(int argc,char *argv[])
{
test01();
return 0;
}
5. char字符常量和变量:
- 直接常量:"1" "b" 'c' ''单引号表示字符对应的ASCII值,""双引号表示的是字符串首元素在计算机的地址;字符串除了表示符号不同外,字符串也会默认\0结尾,多一个占用字节
- 字符变量:用 char 定义,每个字符变量被分配到一个字节的内存空间,字符值以ASCII码的形式存放在变量的内存单元中;
- 输出表示:%c 输出的是字符本身,一字节;%d输出的是字符对应的ASCII值,4字节;
- %05d 右对齐,左边空的位置用0补齐;%-05d,变成了12300,改变了原来大小,故没有此写法;%5.2f 总位宽为5,.2表示小数保留两位,
- 计算机识别的是二进制数,无法直接识别字符; ASCII表是 字符与数字对应关系表
- char ch='a'; char ch=97;一个意思 定义一个字符变量;ch存储的是'a' 的ASCII中对应的值
- ch='a'; ch=ch+1 // 97+1 =98 sizeof('a')----->4 ,int结果占4字节 sizeof(char)----->1 ,字符本身占1字节;
- 获取一个字符的方法:
- 无论scanf敲入多少个字符,只获取第一个scanf("ch=%c\n",ch);
- ch=getchar();
-
#include<stdio.h> void test() { char ch1,ch2; printf("请输入字符串:"); // 输入 abcde ch1得到a,ch2得到d 别的都丢弃 ch1= getchar(); //得到a getchar(); //丢弃b getchar(); //丢弃c ch2=getchar(); //得到d printf("ch1=%c\n",ch1); printf("ch2=%c\n",ch2); } int main(int argc,char *argv[]) { test(); return 0; } // 结果 ch1=a ch2=d // 疑问 为啥getchar()不需要传参就能对一个字符串进行操作;
-
转义字符:\n 换行 \t 四个空格 ;两个\\输出一个\ 两个%%输出一个%
'0'-->48, '\0'--->0 "0"字符0的地址
-
字符串的输出 %s printf("%s\n","hello world");
-
hello world 10个字符加空间11个字节,而默认\0结尾又占一个字节,所以总共12个字节;"hello world\0"系统会默认在字符\字符串末尾添加一个结束字符 \0;\0 结束标识符;
-
%s的作用:从字符串的首元素逐个输出,遇到\0就结束;hello\0 woeld ---->hello;
\0hello----->没有输出; -
''单引号表示字符对应的ASCII值,""双引号表示的是字符串首元素在计算机的地址;
-
11. typedef类型重定义:
给一个已有的类型重新起一个名字,当现有类型比较复杂时,可以用typedef起个别名;
例如:先存在一个复杂类型unsigned short int a =123;
---->typedef unsigned short int U16; 前面加上typedef 在取一个别名
U16 a=123;
- 用已有的类型定义一个变量;
- 用别名替换变量名;
- 在整个表达式的前方加上typedef