赞
踩
计算机要处理的数据(诸如数字、文字、符号、图形、音频、视频等)是以二进制的形式存放在内存中的。
我们将8个比特(bit)称为一个字节(byte),并将字节作为最小的可操作单元。
为了方便存储,需要先在计算机中的内存中找一块区域,规定用它来存放某个数据类型
= :是赋值号,指把数据放到内存的过程。
变量:赋的值可以改变。创造一个变量叫做变量定义;把某个值交给变量,叫做给变量赋值;又因为是第一次赋值,也称变量的初始化,或者赋初值。
数据类型:用来说明数据的类型,确定了数据的解释方式,让计算机和程序员不会产生歧义。
说明 | 字符型 | 短整型 | 整型 | 长整型 | 单精度浮点型 | 双精度浮点型 | 无类型 |
数据类型 | char | short | int | long | float | double | void |
为了让程序的书写更加简洁,C语言支持多个变量的连续定义
数据长度:指数据占用多少个字节。占用的字节越多,能存储的数据就越多,对于数字来说,值就会更大,反之能存储的数据就有限。
在32位环境中,各种数据类型的长度一般如下:
说明 | 字符型 | 短整型 | 整型 | 长整型 | 单精度浮点型 | 双精度浮点型 |
数据类型 | char | short | int | long | float | double |
长度 | 1 | 2 | 4 | 4 | 4 | 8 |
除了C,JAVA、C++、C#等在定义变量时也必须指明数据类型,这样的编程语言称为强类型语言。而PHP、Javascript等在定义变量时不必指明数据类型,编译系统会自动推演,这样的编程语言称为弱类型语言。
printf是print format的缩写,意思是“格式化打印”。这里所谓的“打印”就是在屏幕上显示内容,与“输出”的含义相同,所以我们一般称为printf是用来格式化输出的。
用法:printf("a+b=%d\n", a+b)
%d称为格式控制符,它指明了以何种形式输出数。格式控制均以%开头,后跟其他字符。%d表示以十进制形式输出一个整数。除了%d,printf支持更多的格式控制,例如:
%c:输出一个字符。c是character的简写。
%s:输出一个字符串。s是string的简写。
%f:输出一个小数。f是float的简写。
在puts函数中,可以将一个较长的字符串分割成几个较短的字符串,这样会使得长文本的格式更加整齐。注意,这只是形式上的分割,编译器在编译阶段会将它们合并为一个字符串,它们放在一块连续的内存中。
在现代操作系统中,int一般占用4个字节(byte)的内存,共计32位(bit)。
short、int、long是C语言中常见的整数类型,其中int称为整型,short称为短整型,long称为长整型。
sizeof操作符:用来获取某个数据类型或变量所占用的字节数,如果后面跟的是变量名称,那么可以省略(),如果跟的是数据类型,就必须带上()。
需要注意的是,sizeof是C语言中的操作符,不是函数,所以可以不带()。
使用不同的格式控制符可以输出不同类型的整数,它们分别是:
%hd用来输出short int类型,hd是short decimal的简写。
%d用来输出int类型,d是decimal的简写。
%ld用来输出long int类型,ld是long decimal的简写。
一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制或者十六进制的数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是加前缀。
二进制由0和1两个数字组成,使用时必须以0b或0B开头。
八进制由0~7八个数字组成,使用时必须以0开头。
十六进制由0~9、A~F或a~f组成,使用时必须以0x或0X开头。
十进制由0~9十个数字组成,没有任何前缀。
short | int | long | |
八进制 | %ho | %o | %lo |
十进制 | %hd | %d | %ld |
十六进制 | %hx或%hX | %x或%X | %lx或%lX |
十六进制数字的表示用到了英文字母,由大小写之分,要在格式控制符中体现出来:
%hx、%x和%lx中的x小写,表明以小写字母的形式输出十六进制数。
%hX、%X和%lX中的X大写,表明以大写字母的形式输出十六进制数。
八进制数字和十进制数字不区分大小写,所以格式控制符都用小写形式。
虽然部分编译器支持二进制数字的表示,但是却不能用printf函数输出二进制。
通过转换函数可以将其它进制数字转换成二进制数字,并以字符串的形式存储,然后在printf函数中使用%s输出即可。
在格式控制符中加上#即可输出前缀,例如%#x、%#o、%#lX、%#ho等。
C语言中,short、int、long都可以带上正负号。如果不带正负号,默认就是正数。
符号只有政府两种情况,用1位(bit)就足以表示。
C语言规定,把内存的最高位作为符号位。在符号位中,用0表示正数,用1表示负数。
如果不希望设置符号位,可以在数据类型前面加上unsigned关键字。
使用了unsigned后只能表示正数,不能再表示负数了。
如果将一个数字分为符号和数值两部分,那么不加unsigned的数字称为有符号数,能表示正数和负数,加了unsigned的数字称为无符号数,只能表示正数。
unsigned int可以省略int,只写unsigned。
unsigned short | unsigned int | unsigned long | |
八进制 | %ho | %o | %lo |
十进制 | %hu | %u | %lu |
十六进制 | %hx或%hX | %x或%X | %lx或%lX |
格式控制符合整数的符号是紧密相关的,具体就是:
%d以十进制形式输出有符号数;
%u以十进制形式输出无符号数;
%o以八进制形式输出无符号数;
%x以十六进制形式输出无符号数。
小数分为整数部分和小数部分,它们由点号.分隔。此外,小数也可以采用指数形式,任何小数都可以用指数形式来表示,如aEn或aen,其中a为尾数部分,是一个十进制数;n为指数部分,是一个十进制整数;E或e是固定的字符,用于分隔尾数部分和指数部分。整个表达式等价于a*10^n。
C语言中常用的小数由两种类型,分别是float或double;float称为单精度浮点型,double称为双精度浮点型。float始终占用4个字节,double始终占用8个字节。
小数也可以用printf函数输出,包括十进制形式和指数形式,它们对应的格式控制符分别是:
%f以十进制形式输出float类型;
%lf以十进制形式输出double类型;
%e以指数形式输出float类型,输出结果中的e小写;
%E以指数形式输出float类型,输出结果中的E大写;
%le以指数形式输出double类型,输出结果中的e小写;
%lE以指数形式输出double类型,输出结果中的E大写。
%g会对比小数的十进制形式和指数形式,以最短的方式来输出小数,让输出结果更加简练。
所谓最短,就是输出结果占用最少的字符。
一个数字,是有默认类型的:对于整数,默认是int类型;对于小数,默认是double类型。
如果不想让数字使用默认的类型,那么可以给数字加上后缀,手动指明类型:
在整数后面紧跟l或者L,表明该数字是long类型;
在小数后面紧跟f或者F,表明该数字是float类型。
在C语言中,整数和小数之间可以相互赋值:
将一个整数赋值给小数类型,在小数后面加0就可以,加几个都无所谓;
将一个小数赋值给整数类型,就得把小数部分丢掉,只能取整数部分,这会改变数字本来的值。注意是直接丢掉小数部分,而不是按照四舍五入取近似值。
字符类型由单引号''包围,字符串由""包围。
输出char类型的字符有两种方法:
使用专门的字符输出函数putchar;
使用通用的格式化输出函数printf,char对应的格式控制符是%c。
可以给字符类型赋值一个整数,或者以整数的形式输出字符类型。
反过来,也可以给整数类型赋值一个字符,或者以字符的形式输出整数类型。
C语言中没有专门的字符串类型,只能使用数组或者指针来间接地存储字符串。
char str1[] = "Hello world!";
char *str2 = "阿巴阿巴";
字符集为每个字符分配了唯一的编号,称为编码值。使用编码值来间接地表示字符的方式称为转义字符。
转义字符以\或者\x开头,以\开头表示后跟八进制形式的编码值,以\x开头表示后跟十六进制形式的编码值。对于转义字符来说,只能使用八进制或者十六进制。
\n和\t是最常用的两个转义字符:
\n用来换行,让文本从下一行的开头输出,前面的章节中已经多次使用;
\t用来占位,一般相当于四个空格,或者tab键的功能。
单引号、双引号、反斜杠是特殊的字符,不能直接表示:
单引号是字符类型的开头和结尾,要使用\'表示,也即'\'';
双引号是字符串的开头和结尾,要使用\"表示,也即“abc\"123”;
反斜杠是转义字符的开头,用使用\\表示,也即'\\',或者"abc\\123"。
定义变量时,我们使用了诸如a、abc、mn123这样的名字,它们都是程序员自己起的,一般能够表达出变量的作用,这叫做标识符。
标识符就是程序员自己起的名字,除了变量名,后面还会讲到函数名、宏名、结构体名等,它们都是标识符。不过名字也不能随便起,要遵守规范;C语言规定,标识符只能由字母(A~Z,a~z)、数字(0~9)和下划线(_)组成,并且第一个字符必须是字母或下划线,不能是数字。
关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字,例如int、char、long、float、unsigned等。我们定义的标识符不能与关键字相同,否则就会出现错误。
注释可以出现在代码中的任何位置,用来向用户提示或解释代码的含义。程序编译时,会忽略注释,不做任何处理,就好像它不存在一样。
C语言支持单行注释和多行注释:
单行注释以//开头,直到本行末尾,不能换行;
多行注释以/*开头,以*/结尾,注释内容可以有一行或多行。
表达式必须有一个执行结果,这个结果必须是一个值。
以分号;结束的往往称为语句,而不是表达式。
加法 | 减法 | 乘法 | 除法 | 取余 | |
数学 | + | - | x | ÷ | 无 |
C语言 | + | - | * | / | % |
C语言中的除法运算有点奇怪,不同类型的除数和被除数会导致不同类型的运算结果:
当除数和被除数都是整数时,运算结果也是整数;如果不能整除,那么就直接丢掉小数部分,只保留整数部分,这跟将小数赋值给整数类型是一个道理。
一旦除数和被除数中有一个是小数,那么运算结果也是小数,并且是 double 类型的小数。
scanf和printf的功能相反,printf用来输入数据,scanf用来读取数据。scanf会从控制台读取数据,并赋值给对应的变量。
取余,也就是求余数,使用的运算符是%。C语言中的取余运算只能针对整数,也就是说,%的两边都必须是整数,不能出现小数,否则编译器会报错。
另外,余数可以是正数也可以是负数,由%左边的整数决定:
如果%左边是正数,那么余数也是正数;
如果%左边是负数,那么余数也是负数。
在C语言中,对变量本身进行运算可以有简写形式。假设用 # 来表示某种运算符,那么
a = a # b 可以简写为 a #= b,#表示+、-、*、/、%中的任何一种运算符。
自增:a++或++a; 表示每次变量a自身加1。
自减:a--或--a; 表示每次变量a自身减1。
需要重点说明的是,++ 在变量前面和后面是有区别的:
++ 在前面叫做前自增(例如 ++a)。前自增先进行自增运算,再进行其他操作。
++ 在后面叫做后自增(例如 a++)。后自增先进行其他操作,再进行自增运算。
自减(--)也一样,有前自减和后自减之分。
所谓优先级,就是当多个运算符出现在同一个表达式中时,先执行哪个运算符。
所谓结合性,就是当一个表达式中出现多个优先级相同的运算符时,先执行哪个运算符:先执行左边的叫左结合性,先执行右边的叫右结合性。
当一个表达式中出现多个运算符时,C语言会先比较各个运算符的优先级,按照优先级从高到低的顺序依次执行;当遇到优先级相同的运算符时,再根据结合性决定先执行哪个运算符:如果是左结合性就先执行左边的运算符,如果是右结合性就先执行右边的运算符。
自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。
将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换。
在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。
强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换。换句话说,自动类型转换不需要程序员干预,强制类型转换必须有程序员干预。
强制类型转换的格式为:(type_name) expression
无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值。
在C语言中,有些类型既可以自动转换,也可以强制转换,例如 int 到 double,float 到 int 等;而有些类型只能强制转换,不能自动转换,例如以后将要学到的 void * 到 int *,int 到 char * 等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。