1.字符串常量
如“hello world”,在c语言中,其存储的数据并不是"h" ,"e" ......这包括空格在内的11个字符,在字符串的结尾,存储的时候还会用一个“\0”来标识字符串的末尾。
字符串用"string "(双引号)来表示。
如'a'和"a"的区别,一个是占一个字节的字符型常量,另一个是有\0来标识末尾的字符串。
2.标识常量
如#define N 5
宏只是代码的替换,中间不进行任何数据的运算和操作。
宏一般都用大写,用来和变量区分。
3.变量
定义变量时
数据类型 变量名;或要一次定义多个同种数据类型的变量 数据类型 变量名,变量名,......;
如int a;
int a ,b ,c ,d;
初始化:定义变量的时候赋初值。如int a=0;
赋值:定义变量后,对变量赋值。如int a; a=0;
注意,虽然赋值后变量存储的值相同,但不能把初始化和赋值说成同一个过程,二者是不等价的,初始化是直接将数存入定义变量的空间中,二赋值是将数从数所在的空间拷贝到变量所在的空间。
4.类型转换
1.显示型转换(强制类型转换)
如 (int)3.14转换的结果就是int型的3,定义double d=3.14;那么 (int)d==3,该类型转换只在有标识的地方转换一次,其余地方该变量依然不变,也就是d依然等于3.14。
2.隐式类型转换
表达式:一个多个常量和变量组成的式子。表达式一定有值,表达式一定有类型。
而表达式的结果的类型,一定是其中精度最高的常量或变量的类型。
浮点型精度 > 整形精度
同种类型所占内存空间越大精度范围越高
无符号精度 > 有符号精度
float类型进行数据运算和数据处理时会转换为double类型
short、char类型进行数据运算和数据处理时会转换为int类型
char + char == int
char + short == int
float + float == double
float + double == double
float + int == double
一个浮点型的常量 如3.1452,其默认的类型是double双精度浮点数。而一个整形的常量如5,其默认的类型是int。
5.运算符
1.算数运算符
+
-
*
/ : 不能除以0
% : 不能对浮点数操作
++ 自增运算符
-- 自减运算符
i++; 先用再加
++i; 先加再用
i--; 先用再减
--i; 先减再用
2.赋值运算符
=
+=
-=
*=
/=
%=
左值:允许放在赋值运算符左边的值
左值应为变量
常量、表达式均不能作为左值
右值:允许放在赋值运算符右边的值
常量、变量、常量变量组成的表达式
左值为浮点数类型,右值为整形,会将值扩展精度
如double a;
a=3;
a的结果为a=3.0
左值为整数类型,右值为浮点数类型,会舍弃精度
如int a;
a=3.14;
a的结果为舍弃了3.14的小数部分,变为了3
左右两边均为整形:将右值直接拷贝到左值空间中
小数据放入大空间:数据扩展,有符号数高位补符号位,无符号高位补0
大数据放入小空间:直接截取数据低位放入小空间
如
char ch = 300;
printf("ch = %d\n", ch); //44
char一个字节,该类型的变量二进制有8位来存储数据的大小(包括符号位),将300赋初值给ch变量,300这个十进制数转换成二进制数明显不止8位,所以直接会将低8位赋值给ch,包括符号位也会接受赋值。
这八位转换成10进制,输出结果为ch =44。
再如。
char ch = 130;
printf("ch = %d\n", ch); //-126
将int型4个字节的常量130的低八位拷贝到char型ch变量的8位,符号位恰好为1,这代表char现在存的是一个负数,我们都知道,负数二进制存的是补码,所以这八位就是结果的补码,要经过还原成原码来计算存储的结果。
结果为-126。
3.三目运算符(特殊运算符)
表达式 ? 表达式1 : 表达式2
若表达式为1,则执行表达式1,否则执行表达式2。
结合方向:自右至左
如x > y ? x :y > z ? y : z
其实是x > y ? x :(y > z ? y : z)这样执行的
4.逗号运算符
从左到右依次执行表达式,并将最后一个逗号表达式的结果作为整体逗号表达式的结果
如 a=(c+d,e+f,e++,d++,m,o+p)
最后o+p就是赋给a的值,而且e和d也执行了自加1。
5.sizeof运算符
sizeof (数据类型/变量名) 获得数据类型/变量在内存中所占的字节数