1.数据类型
1.1数据类型的分类
1.2基本数据类型
逻辑类型。只有两个量true和false,表示逻辑真值和逻辑假值。
注:bool类型: <stdbool.h> _Bool基本类型,(非零true,零false)
整数类型。包括char, short, int和long。
char类型:
长度:1
值阈:char:-128到127;unsigned char:0到255;
short类型:<limits.h>
长度:2
值域:short:-32768到32767;unsigned short:0-65535;
int类型:(int,unsigned int)
长度:4;
值域:int:-2147483648;unsigned int:0到2(^32)-1;
long类型:
长度:4;
值域:同int;
浮点类型。
float:长度4;
double:长度8;
void类型。主要用于说明不返回值的函数或指向任一类型的指针等。
1.3强制数据类型的转换
强制数据类型的转换是指采用某种方式将某种数据类型强制转换成指定的数据类型。包括显式的数据类型转换,和隐式的数据类型转换。
例如, int a=22, b=0 ;
float c = 24.87, d= 3.3;
b = (int) (a + c +d) ; // b为50
强制类型转换符后面的表达式如存在复杂运算,就一定要用小括号括起来 ;
强制类型转换符是一种不安全的转换,一般都是将高级类型转换成低级类型,要丢失数据的精度;
强制类型转换并不改变表达式中变量的数据类型和其值。
2.常量
2.1基本数据类型常量
整型常量:常量是指在程序运行期间其数值不发生变化的数据。整型常量通常简称为整数。
整数可以是十进制数、八进制数和十六进制数。
例如,十进制的数值3356可以有下列二种不同的表示形式:
八进制数 06434
十六进制数 0xd1c
浮点常量:浮点常量又称为实数,一般含有小数部分。
在C语言中,实数只有十进制的实数,分为单精度和双精度。
实数有两种表示方法, 即一般形式和指数形式。
指数常量:指数形式的实数一般是由尾数部分、字母e或E和指数部分组成。
当一个实数的符号为正号时,可以省略不写,其表示的一般形式如下:
1.176e+10 表示 1.176×1010
- 3.5789e-8 表示 -3.5789×10-8
通常表示特别大或特别小的数
可以把字符常量看做一个字节的正整数。
字符常量:字符常量是指一个单一字符, 其表示形式是由两个单引号包括的一个字符。
“A’, ‘a’, ‘Q’, ‘0’, ‘9’, ‘+’, ‘:’, ‘?’, ‘$’ 都是字符常量。
在C语言中, 字符常量具有数值。字符常量的值就是该字符的ASCII码值。
可以把字符常量看做一个字节的正整数。
例如,char a, b, u, v
a = 'F' ; // 将70送给a
b = 'A'+2; // b存放的是 'C' 字符
u = ' ' + 'B'; // u存放的是 'b' 字符
v= 'b' - 32; // v存放的是 'B' 字符
它们分别相当于下列运算;
a= 70; b= 65+2; u= 32+66 ; v= 97-32;
字符串常量:所谓字符串常量是指用双引号括起来的一串字符来表示的数据。(字符串以\0结尾) “9”—‘9’,’\0’
2.2标识常量
例如
#define MAX 50
#define PI 3.1415926
#define NULL 0 #define EOF -1
#define ERROR -1
宏定义函数
有一些任务根本无法用函数实现,但是用宏定义却很好实现。
比如参数类型没法作为参数传递给函数,但是可以把参数类型传递给带参的宏。
#define MALLOC(n, type) \ ( (type *) malloc((n)* sizeof(type)))
3.变量
3.1变量的基础
变量在程序中用变量名表示。变量名由用户根据其用途任意命名。
变量名由字母、数字、下划线组成,不能以数字开头,不能和C的关键字重名。
在程序运行时,变量占据存储空间的大小由其数据类型决定。
变量在内存空间中的首地址,称为变量的地址。
3.2变量的说明
变量在程序中使用时,必须预先说明它们的存储类型和数据类型。
变量说明的一般形式是: <存储类型> <数据类型 > <变量名> ;
<存储类型>是关键词auto、register、static和extern;
<数据类型>可以是基本数据类型,也可以是自定义的数据类型;
3.3变量的存储类型
auto说明的变量只能在某个程序范围内使用,通常在函数体内或函数中的复合语句里(默认是随机值;
在函数体的某程序段内说明auto存储类型的变量时可以省略关键字auto,如下:
auto int k ;
int j ;
double x;
register称为寄存器型,register变量是想将变量放入CPU的寄存器中,这样可以加快程序的运行速度。如申请不到就使用一般内存,同auto ;
register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。
由于寄存器的数量有限,真正起作用的register修饰符的数目和类型都依赖于运行程序的机器。
在某些情况下,把变量保存在寄存器中反而会降低程序的运行速度。因为被占用的寄存器不能再用于其它目的;或者变量被使用的次数不够多,不足以装入和存储变量所带来的额外开销。
static变量称为静态存储类型的变量,既可以在函数体内,也可在函数体外说明。(默认是0)
局部变量使用static修饰,有以下特点:
在内存中以固定地址存放的,而不是以堆栈方式存放;
只要程序没结束,就不会随着说明它的程序段的结束而消失,它下次再调用该函数,该存储类型的变量不再重新说明,而且还保留上次调用存入的数值;
extern:当变量在一个文件中的函数体外说明,所有其他文件中的函数或程序段都可引用这个变量。
extern称为外部参照引用型,使用extern说明的变量是想引用在其它文件中函数体外部说明的变量。
static修饰的全部变量,其它文件无法使用
4.运算符
4.1算数运算符
C提供的算术运算符:+,-,*,/,%,++,如下:float/double不能取余;
4.2关系运算符
4.3逻辑运算符
4.4位运算符
&-位与:都是 1 结果才为 1;
“ | ”位或:有一个 1 结果就是 1;
^-异或(相异为真): 不同为1,相同为假0;
移位运算:左移,右补零;
4.5赋值运算符
赋值运算符为“=”,其运算的一般形式如下: <左值表达式> = <右值表达式>
//赋值复合运算符其运算的一般形式如下: <变量> <操作符>= <表达式>
#include <stdio.h>
int main(int argc, char *argv[])
{
int n= 0, sum = 0;
while (n++ < 100){
sum += n;
}
printf("sum=%d\n", sum);
return 0;
}//sum=5050
4.6条件运算符 “ ? : ”
是三目运算符, 其运算的一般形式是: <表达式1> ? <表达式2> : <表达式3>
4.7逗号运算符
右边的从左到右算,右边算到最后一个,赋值给左边;
例:z = (x=5, y=6, x+y ) ;//z=11
4.8sizeof运算符:
运算的一般形式:sizeof(<类型或变量名>)
注意:它只针对数据类型,而不针对变量!
例如: sizeof(double) ; sizeof(long)
4.9运算符的优先级
例如:
int x=1, y=0, z=0;
x++ && y++ || ++z //结果为 1 (2 1 1)
! (x+1>0) && y++ || ++z //结果为 1 (1 0 1)
x += y==z, y=x+2, z=x+y+x >0//x为2,y为4 ,z为1