内存
计算机执行程序时,组成程序的指令和程序所操作的数据都必须存储到某个地方,这个地方就是机器的内存
8个位(bit)---一个字节(byte)
1KB----1024字节
1MB----1024KB
1GB----1024MB
-----------------------------------------------------------------------------------------------------
变量
变量是计算机里一块特定的内存,由一个或者多个连续的字节所组成。每一个变量都有一个名称,可以 用该名称表示内存的这个位置,以提取它包含的数据或者存储一个新数值。
整数变量
整数是没有小数点的数字。
变量声明: int salary; 数据类型 变量名;
声明多个同类变量: int brothers,brides;
声明后分配存储空间
初始化: brides=7;
printf()语句和之前有点不同
printf("my salary is %d.",salary);
两个参数,逗号隔开。参数如下:
参数1,控制字符串,控制其后的参数输出以什么方式显示。放在双引号之内的字符串,也称为格式字符串,因为指定了输出数据的格式。
参数2是变量名salary。这个变量值的显示方式是由第一个参数--控制字符串来决定
本例的控制字符串中有一个%d,%d称为变量的转换指定符(conversion specifier)
转换字符串确定变量在屏幕上的显示方式。本例中使用了d,它是用于整数值的十进制指定符,表示第二个参数salary输出为一个十进制数。
转换指定符总是以%字符开头
使用多个变量在printf()语句用逗号隔开,在2,号位置依次排
也可以在函数的其他参数中使用运算符,取读编译的话是先运算再放入输出函数中。
int a=3;
printf("we add %d money",-a);
printf("we add %d money",a*a);
变量命名
不能以数字开头
只包含字母、数字、下划线
以一个下划线开头的变量名常用语头文件,变量一般不用下划线为第一个字符
不要用特殊变量名
变量名区分大小写
-------------------------------------------------------------------------------------------------------
基础算术运算符
+
-
*
/
%
关于取摩:
A>B,且A B>=0 就是余数
A<B,且A B>=0 就是A本身
A<0,B>0 就是-(|A|%|B|)
A>0,B<0 |A|%|B|
A<0,B<0,A<B -|A|%|B|
A<0,B<0,A>B -|A|%|B|
总结:
AB同号为正 A>B,余数
A<B,A
AB同号为负 A>B,-A
A<B,-绝对值的余数
A负B正 -绝对值的余数
A正B负 绝对值的余数
----------------------------------------------------------------------------------------------
数据类型
变量与内存,不同的变量占用的内存不同,例如-128~+127的整数可以使用一个字节存储,超出范围就不一样了。
整数变量类型
signed char 1 -128~+127 2^7
short int 2 -32768~+32767 2^15
int 4 -2147438648~+2147438647 2^31
long int 4 -2147438648~+2147438647
long long int 8 -9223372036854775808~+9223372036854775807 2^63
无序整数类型
unsigned char 1 0~255(2^8)
unsigned short int 或unsigned short 2 0~65535(2^16)
unsigned int 4 2^32
unsigned long int 或unsigned long 4 2^32
unsigned long long int 或unsigned long long 8 2^64
一般short 是short int的缩写,long 是long int 的缩写
long long 后缀名为LL
无符号类型 后缀U
浮点数
表示方法:
AEB
E表示底数10,后面加的是10的指数,一般前面的是大于0.1小于1
使用float需要在数据后面加f,使用long double需要在数据后面加l
使用浮点数:
#include <stdio.h>
int main(void)
{
float plank_length=10.0f;
float piece_count=4.0f;
float piece_length=0.0f;
piece_length=plank_length/piece_count;
printf("A pank %f feet long can be cat into %f pieces %f feet long."
,plank_length,piece_count,piece_length);
return 0;
}
%f表示浮点数,这样的显示的小数位数是5位。%d表示的是整数,如果在%f中给的参数是整数,那么它会将参数转换成浮点数再插入,在%d中插入浮点数也是同理
使用默认的小数位数可能太过于精确,我们怎么控制小数位数呢?
如果想要保留两位小数,使用%.2f,如果是想要3位小数,使用%.3f
控制输出的字段宽度
输出字段的宽度是输出值所使用的总字符数(包括空格),一般是默认的。
在上面的控制小数点数只能控制小数点后的宽度,如何控制输出的字段宽度?
浮点的格式指定符:
%[width][.precision][modifier]f
[]内容表示可选可不选
width:一个整数,表示输出的总字符数。宽度,这个注意,不是表现的数字和小数连接的长度,还包括左右的部分空格。
precision:小数点后位数
modifiter:是否long修饰,是的话就加L
printf("A pank %8.2f feet long can be cat into %5.0f pieces %6.2f feet long." ,plank_length,piece_count,piece_length); return 0;
指定宽度时,默认为右对齐。如果希望数值左对齐,只需要在%后面添加一个负号
左对齐与右对齐的区别:(上左下右)
也可以对整数值指定字段宽度以及对齐方式。例如%-15d指定一个整数是左对齐,其字段宽度为15个字符。
比较复杂的表达式:
一些符号的优先级和数学中相同
demo1:
#include <stdio.h> /*计算圆的周长和面积*/ int main(void) { float radius=0.0f; float diameter=0.0f; float circumference=0.0f; float area=0.0f; float pi=3.14159265f; printf("Input the diameter of the table:"); scanf("%f",&diameter); radius=diameter/2.0f; circumference=2.0f*pi*radius; area=pi*radius*radius; printf("\nThe circumference is %.2f\n",circumference); printf("\nThe area is %.2f\n",area); return 0; }
scanf()函数
处理键盘输入,按照第一个参数指定的方式解释它,存入第二个参数指定的变量中
注意第二个参数前面有一个&,&被称为寻址运算符,使用scanf的时候在第二个参数前面要加上它
l是小写的L,注意在接受输入值的变量名前面加上寻址运算符&
定义常量
1、使用defind在预处理指令中定义
例如:
#define PI 3.14159
在C语言中有一个约定,用defind定义的变量名都是大写
后面main方法里面直接使用即可。
#include <stdio.h> #define PI 3.14159f int main(void) { float radius=0.0f; float diameter=0.0f; float cirumference=0.0f; float area=0.0f; printf("Input the diameter of the table:"); scanf("%f",&diameter); radius=diameter/2.0f; cirumference=2*PI*radius; area=PI*radius*radius; printf("the table cirumference is %0.2f" "\nThe table area is %0.2f",cirumference,area); return 0; }
注意:在使用scanf()函数的时候不能控制输出的数的宽度,我之前试过一次,控制了宽度键盘输入的值进不去
2、在方法中声明变量,不过使用const关键字修饰,使得它变为常量,值无法被修改。
#include <stdio.h> int main(void) { float diameter=0.0f; float radius=0.0f; const float Pi=3.14159f; printf("Please Input the table diameter:"); scanf("%f",&diameter); radius=diameter/2.0f; printf("\nThe circumference is %.2f",2.0f*Pi*radius); /*2.0f*Pi*radius*/ printf("\nThe area is %.2f",Pi*radius*radius); return 0; }
极限值
一种数据类型都会有它的范围,在最大与最小两个端点的数值为极限值。
头文件<limits.h>定义了整型的极限值,如果要在程序中使用这些极限值的话需要导入<limits.h>
无符号整型上限都是0,下限分别是:UCHAR_MAX,USHART_MAX,UINT_MAX,ULONG_MAX,ULLONG_MAX
头文件<float.h>定义了表示浮点类型的符号
#include <stdio.h> #include <limits.h> #include <float.h> int main(void) { printf("\nVariable of type chaR store values from %d to %d", CHAR_MIN,CHAR_MAX); printf("\nVariable of type unsigned chat store values from 0 to %d", UCHAR_MAX); printf("\nVariable of type short store values from %d to %d", SHRT_MIN,SHRT_MAX); printf("\nVariable of type unsigned short store values from 0 to %d", USHRT_MAX); printf("\nVariable of type int store values from %d to %d", INT_MIN,INT_MAX); printf("\nVariable of type unsigned int store values from 0 to %d", UINT_MAX); printf("\nVariable of type long store values from %d to %d", LONG_MIN,LONG_MAX); printf("Variable of type unsigned long store values from 0 to %d", ULONG_MAX); printf("\nVariable of type long long store values from %d to %d", LLONG_MIN,LLONG_MAX); printf("\nVariable of type unsigned long long store values from 0 to %d", ULLONG_MAX); return 0; }
%d输出有符号整数值的极限值
%u输出无符号整数值的极限值
%e输出浮点类型的极限值
sizeof运算符
使用sizeof运算符可以确定给定的类型占据多少字节。当然,在C语言中,sizeof是一个关键字。
表达式sizeof(int)会得到int类型的变量所占的字节数,所得到的类型是一个size_t类型的整数。
size_t类型在标准头文件<stdio.h>中定义,对应于一个基本整数类型。但是,size_t类型对应的类型可能在不同的C库中有所不同,所以建议使用size_t存储sizeof得到的值,即使知道该值的基本类型也是如此
sizeof运算符的结果是一个整数,所以使用%d输出
sizeof(int)
sizeof()的参数为数据类型可以得到一个该数据类型所占的字节数
sizeof var_name
sizeof 空格 变量名 可以得到该变量的所占的字节数
#include <stdio.h>
#include <stddef.h> /*size_t type was saved in <stddef.h>*/
int main(void)
{
size_t cr=sizeof(char);
printf("\nVariables of type char occupy %d bytes",cr);
printf("\nVariables of cr occupy %d bytes",sizeof cr);
printf("\nVariables of type int occupy %d bytes",sizeof(int));
printf("\nVariables of type short occupy %d bytes",sizeof(short));
printf("\nVariables of type long occupy %d bytes",sizeof(long));
printf("\nVariables of type float occupy %d bytes",sizeof(float));
printf("\nVariables of type double occupy %d bytes",sizeof(double));
printf("\nVariables of type long occupy %d bytes",sizeof(long));
return 0;
}
size_t 类型可以使用%d输出
选择正确的类型:
错误示例1:
#include <stdio.h> int main(void) { const float Revenue_Per_150=4.5f; short JanSold=23500; short FebSold=19300; short MarSold=21600; float RevQuarter=0.0f; short QuarterSold=JanSold+FebSold+MarSold; printf("\nStock sold in\n Jan: %d\n Feb: %d\n Mar: %d",JanSold,FebSold,MarSold); printf("\nTotal stock solid in first quarter: %d",QuarterSold); RevQuarter=QuarterSold/150*Revenue_Per_150; printf("\nSales revenue this quarter is:$%.2f\n",RevQuarter); return 0; }
原因在于short数据类型存储的最大值是32767,而这里将要存储的值为64400,超出了范围,所以输出了一个负值。
解决方法是将QurterSold变成int或者是long类型能够存储这个数值即可。
类型转换
1、强制类型转换
在要被转换的变量前面加上括号,括号内为希望转换的类型
int number1=(int)3.14159;
2、自动类型转换
只有两个操作数的类型相同,计算机才能执行二元算数操作(加减乘除取摩)。
在二元运算中使用不同类型的操作数,编译器就会把其中一个值域较小的操作数类型转换成为另一个操作数的类型,这就是隐式类型转换
float a=1256*0.45;
隐形式转换一般是小范围转换成为大范围。
无符号整数类型的级别从低到高:
signed char,short,int,long,long long
每一个无符号的整数类型与和它对应的带符号的整数类型相同,所以unsigned int类型的优先级和int类型相同。
不同级别的按照级别转换
同级别的无符号的和带符号,将带符号的转换车工无符号的再运算,因为对于负值来说,无符号的范围更大,有符号的是从0开始。
同级别的无符号的不需要转换
同级别的带符号的两个要都转换成无符号的再运算。
当然,上面说的都是自动转换哦!
赋值类型中的隐式转换:
赋值运算符右边的表达式与左边的变量有不同的类型时,也可以进行类型隐式转换。在一些情况下,会截短数据,丢失数据。
例如:将double值赋给int
int num=0; float value=2.5f; number=value;
其他数据类型
char 类型。一般只需要一个字节。char的存储范围为带符号-128~127,不带符号0~255
可存储:字符,转义字符指定字符常量、值域内数字(可以进行char类型的对于数字的位置的加减,每一个数字代表值域范围内的一个字符)
char的变量有双重性,可以把它解释成一个字符,也可以解释成为一个整数。
char letter=74;/*J*/ letter=letter+5;/*O*/ printf("%c",letter);/*当你这里是将它转换成%c形式的时候,它是一个字符*/
printf("%d",letetr);/*你这里将它转换成%d形式的时候,它是一个整数*/
printf("%x",letter);/*将它转换成%x,将char类型变量的整数值输出为十六进制*/
宽数据类型
wchar_t类型的变量存储多字节字符码,一般占用两个字节。在处理Unicode字符时,就需要使用wchar_t类型。
wchar_t类型在标准头文件<stddef.h>中定义。
在char类型的字符常量前面加上修饰符号L,就可以定义一个宽字符常量。
wchar_t w_ch=L'A';
wchar_t使用%lc格式指定符
枚举
再编程时,常常希望变量存储一组可能值中的一个。例如一个变量存储表示当前月份的值。C语言中的枚举(enumeration)就用于这种情形。
利用枚举,可以定义一个新的整数类型,该类型变量的值域是我们指定的几个可能值
声明一个枚举
enum Weekday { Monday,Tuesday,Wendensday,Thursday,Friday,Saturday,Sunday };
enum Weekday today;//声明该枚举变量
Weekday紧跟在enum关键字后面,这个类型名称成为枚举的标记。
Weekday类型的变量可以是它内容中的任意值。
Weekday中的值叫做枚举器或枚举常量,数量任意。每一个枚举器都用唯一名称指定,枚举器可以想象为有一个从0开始的下标,后一个枚举的下标都比前一个枚举大1(这个可能在枚举算术运算时候使用到)。
在声明枚举的时候同时声明该枚举的变量:
enum Weekday{ Monday,Tuesday,Wensday,Thursday,Friday,Saturday,Sunday } today, tomorrow;
也可以在声明的同时给它赋值:
enum Weekday{ Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday } today=Monday,tomorrow=Thursday;
枚举类型的变量时整数类型,可以在算术表达式中使用。
前面的语句可以写为:
enum Weekday{ Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday } today=Monday,tomorrow=today+1;
选择枚举值:
可以给人以或所有枚举器明确指定自己的整数值。尽管枚举使用的名称必须唯一,但是枚举的值不要求是唯一的。
enum Weekday{ Monday=1,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday };
枚举器Monday到Sunday的对应值是1~7.在明确指定了值的枚举后面,枚举会被赋予连续的整数值,这使得枚举可能有相同的值
enum Weekday{
Monday=5,Tuesday=4,Wednesday,Thursday=10,Friday=3,Saturday,Sunday
};这里Monday和Sunday的值都是5,Wednesday和Sunday的值都是4
只要希望变量有限定数量的可能性,就可以使用枚举。
枚举类型的输出:
在C语言中,枚举变量,即以enum关键字定义的变量,是按照整型或者无符号整型来处理的。 1 如果在枚举变量中,不存在负值,如 enum test { A, B, }; 这样的定义,系统会将该枚举变量按照无符号整型处理,即unsigned int 型。输出的时候使用%u格式即可。 enum test t = A; printf("%u", t); 2 如果在枚举变量中存在负值,那么系统按整型处理,即int型。如定义 enum test { A=-199, B, }; 输出时,需要用%d格式: enum test t = A; printf("%d", t); 3 由于枚举变量在书写时,一般不会太大,很少有在没有负数的时候,即按照无符号数处理的时候超出有符号数所能表示的正数范围,即一般不会把最高位置一,所以大多数情况下,用%d输出都是没问题的。
输出枚举器的名称,需呀提供相应的程序逻辑。
未命名的枚举类型
在创建枚举类型的变量的时候,可以不指定标记,这样就没有枚举类型名了。例如:
enum{red,crange,yellow,green,blue,indigo,violet} shirt_color;
这里没有标记,所以这个语句定义了一个未命名类型的变量shirt_color.
可以用通常的方式给shirt_color赋值:
shirt_color=blue;
_Bool类型的变量
true和false,也可以是0或者1,1对应true,0对应false
非0数字转换成为_Bool会得到1(true),0就转换成0(false)
_Bool类型优先级低于其他类型,一般进行运算都是将它隐式转换。
使用_Bool类型最好导入<stdbool.h>头文件
复数跳过了,数学没学好啊!
赋值操作的op=形式
C语言提供了一些操作的缩写形式。考虑下面的代码:
number=number+10;
有一个缩写形式:number+=10;
变量名后面加运算符加等于号就是op赋值操作。形式Aop=B 相当于A=AopB,op可以是任意算术运算符和按位运算符
variable*=12 等价于 variable=variable*12;
看到这个op形式想到了java中的++a和a++的区别了:++a,a在基础上加1立即生效,a++则是在是这行代码结束后才生效a的值才加1.