达内C语言笔记_第1页
达内C语言笔记_第2页
达内C语言笔记_第3页
达内C语言笔记_第4页
达内C语言笔记_第5页
已阅读5页,还剩149页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

dayOl(C编程基本结构输出函数)4

■标准化4

■经典hello程序4

■gcc编译器4

■基本数据类型10

■原码与补码10

■ASCH码12

■常量与变量12

■变量与数据类型13

■变量与变量的size13

■类型转换13

■范例14

dayO2AM(变量常量)15

■C的保留字15

■C变量名15

■vi初始化文件15

■变量声明16

■常量20

■const限定符20

dayO2PM(运算符)22

■表达式的左值与右值22

■算数运算符22

■赋值运算符22

■关系运算符23

■判等运算符23

■逻辑运算符23

■位运算25

♦按位取反25

♦按位与25

♦按位或25

♦按位异或26

♦左移26

♦右移26

■取地址运算符27

■逗号运算符28

■条件运算符28

■自增/自减运算29

■运算符与结合性32

day03AM(格式化输入控制语句)34

■scanf()从键盘输入34

■程序语句35

■流程控制语句36

■条件判断语句36

■分支语句38

dayO3PM(循环枚举)39

■循环语句39

■九九表程序45

■用typedef定义类型46

■枚举类型46

day04(数组结构体)49

■范例49

■复杂数据类型49

■数组50

■字符串字面量56

■二维数组59

■结构体63

dayO5AM(struct位段union)67

■内存的对齐与补齐67

■位段68

■共用体(联合)71

dayO5PM(函数)72

■函数72

♦函数的定义72

♦函数的声明72

♦函数的调用73

■函数范例一75

■函数范例二76

■C与C++的部分区别78

dayO6AM(变量种类栈堆)79

■变量种类80

■变量的作用域与可见性80

■register变量85

■volatile变量85

■栈的技术简介85

■堆与内存管理86

dayO6PM(函数传参)87

■函数传参87

■数组作参数89

■可变长参数的函数92

■递归函数95

■汉诺塔程序98

day07(预处理命令)99

■宏定义指令#define99

♦不带参数的宏定义99

♦带参数的宏定义(宏函数)100

♦#和##101

■“文件包含”处理103

■条件编译指令103

■预定义宏107

♦标准预定义宏107

♦编译器预定义宏107

day08AM(指针)108

■指针的定义108

■指针的操作109

■地址作为参数113

■数组作为参数114

■const与指针114

■字符串115

■虚拟内存,内核空间,用户空间,内存映射118

♦虚拟内存118

♦内核空间到物理内存的映射118

♦页式映射119

dayO8PM(多级指针空指针)120

■不同的main()格式120

■多级指针122

■空指针(void*)123

day09(数组指针函数指针堆空间)125

■指针数组125

■数组指针125

■函数指针128

■堆空间133

♦malloc133

♦calloc133

♦realloc134

♦free134

day10(I/O流文件格式控制)136

■I/O流136

■字符串:sscanf,sprintf137

■文件:fscanf,fprintf138

■文件:fopen,fclose139

■格式字符串141

■gets,puts,fgets,fputs143

■getchar,putchar,fgetc/getc,fputc/putc144

■fseek148

■fread,fwrite150

■ungetc153

■feof154

>dayO1(C编程基本结构输出函数)

■标准化

20世纪70年代,出现了第一本关于C语言的书籍一《CprogrammingLanguage》,这本

书成了程序员编写程序事实上的标准。

1983年美国开始制定本国的C语言标准,在1989年12月正式通过,我们把这个标准

称为C89。1995年C语言有做出一些改变,1999年通过了C99标准。

■经典hello程序

c程序文件的后缀名必须是.c。

c程序文件不是可执行文件,是源代码程序。

需要用gcc来翻译,它会把c程序转换成对应的机器指令,存放在a.out文件中,它是

一个可执行文件。

vixxx.c编辑(edit),生成c语言源文件。

gccxxx.c——编译连接(compilelink),如果没错误,就生成可执行文件a.out。

编译连接可分开做:

编译:gcc-cxxx.c,如果没错误,会产生一个目标文件xxx.o(windows中是xxx.obj);

连接:gccxxx.o如果没错误,生成a.out。

a.out运行,shell首先找到这个可执行文件,然后内核来执行它。

c源程序是采用标准c语法来写,标准c是国际标准,所以c源程序是可移植的,可以

应用于任何操作系统以及任何的编译工具,但是不可执行。

a.out己经生成了具体的系统下的机器码了,所以它是不可移植的。

不同操作系统的可执行文件的格式不同,linux系统中可执行文件格式一般为ELF,

windows系统是PE。

■gcc编译器

我们已经使用过了gcc命令,那么gcc是什么呢?

GCC是C语言的最流行的一个编译器,GCC(GNUCompilerCollection,GNU编译器

套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发行的

自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑MacOSX操作系统

的标准编译器。

GCC最基本的用法是:gcc(options)(filenames]o

其中options就是编译器所需要的参数,filenames给出相关的文件名称。

-c:只编译,不连接成为可执行文件,编译器只是由输入的.C等源代码文件生成.O为后

缀的目标文件,通常用于编译不包含主程序的子程序文件。

-ooutput_filename:确定输出文件的名称为output_filename,同时这个名称不能和源文

件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

-g:产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们

就必须加入这个选项。

-O:对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中

进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相

应地要慢一些。

-02:比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。

-std:选择编译程序所使用的C语言的标准,可以使用・std=c89或者-std=c99。

-S:生成汇编代码文件。

-E:查看预处理后的代码,显示在终端屏幕上。

|root@192cl|#vihello.c

main()

|root@192cl|#gcchello.c

|root@192cl]#Is

a.outhello.cprintf.c

[root@192cl|#a.out

[root@192cl|#rm-fa.out

[root@192cl|#gcc-chello.c

|root@192cl|#Is

hello.chello.oprintf.c

[root@192cl|#gcchello.o

[root@192cl|#Is

a.outhello.chello.oprintf.c

[root@192cl|#a.out

[root@192cl|#rm-fa.out

[root@192cl|#ls

hello.chello.oprintf.c

|root@192cl|#gcchello.o-ohello[-o:指定可执行文件的名字,不指定就叫a.out。]

[root@192cl|#Is

hellohello.chello.oprintf.c

[root@192cl|#rm-fhellohello.o

[root@192cl]#ls

hello.cprintf.c

|root@192cl|#gcchello.c-ohello【两步并一步】

[root@192clI#is

hellohello.cprintf.c

规范的写法:

intmain()【前面如果不写int,默认也是int】

(

return0;【返回一个整数0,与前面的int相呼应;返回0表示一切正常;

默认的返回值是0,出错返回-1;习惯上,一切正常,就写:return。;

在main函数中,如果不写该句,编译器会自动产生return0;

对于其他函数,如果要求有返回值,但没写return,就会随机带回一

个值】

main函数(主函数)是一个C程序中必备的且只能有一个,否则连接出错。

标准c自带很多头文件,存放在目录/usr/include下。

C语言的一个突出优点就是标准库,里面包含了很多用于输入输出,字符串操作,分配

内存等非常实用的函数。标准库中的函数名全部小写。

头文件里存放的一般都是函数的声明。

|root@192cl|#vihcllo.c

/*这是我的第一个Linux环境下的C程序【注释,也可用〃注释一行;多行注释不可嵌套】

经典不容错过的helloworld*/

#include<stdio.h>[#开头的行叫预处理行;将stdio.h头文件的内容插入到该位置;

预处理行要写在一行上,如果太长,可在文件末尾用'\'作为续行符:

预处理行结尾不加分号】

intmain()

(

printf("hellocsdl007!\n");【以分号结尾的称为一条语句,表达一个相对完整的命令】

return0;

|root@192cl|#gcchello.c-ohello

|root@192cl|#hello

hellocsdl007!

<>:里面写的是标准c自带的头文件,插入自己写的文件可用双引号“二

写成<>,就只去标准C的头文件目录/usr/include下去找,写成“”,就在当前目录下找;

如果带了路径,就按路径查找。

例如要用/usr/include目录下的sys目录下的socket.h,需要写成:#include<sys/socket.h>«

要查看某个函数在哪儿头文件中,只需要:man-a函数名。

[chenzongquan]$man-aprintf

PRINTF(1)UserCommands

PRINTF(l)

NAME

printf-formatandprintdata

SYNOPSIS

printfFORMAT[ARGUMENT]

printfOPTION

DESCRIPTION

PrintARGUMENT(s)accordingtoFORMAT.

—helpdisplaythishelpandexit

——version

outputversioninformationandexit

FORMATcontrolstheoutputas】inCprintf.Inter­

pretedsequencesare:

此时显示的是用户命令,按q进入到下一个printf:

PRINTF(P)POSIXProgrammer*sManual

PRINTF(P)

NAME

printf-writeformattedoutput

SYNOPSIS

printfformat「argument...]I

DESCRIPTION

TheDrintfutilityshallwriteformattedoperandsto

thestandardoutput.Theargumentoperandsshallbe

formattedundercontroloftheformatoperand.

OPTIONS

None.

OPERANDS

Thefollowingoperandsshallbesupported:

formatAstringdescribingtheformattousetowrite

I

此时显示的还是一个命令,再按q进入到下一个printf:

PRINTF(3)LinuxProgrammerJsManual

PRINTF(3)

NAME

printf,fprintf,sprintf,snprintf,vprintf,

vfprintf,vsprintf,vsnprintf—formattedoutputcon­

version

SYNOPSIS

#include<stdio.

intprintf(constchar"format....);

intfprintf(FILE*stream,constchar*format.,...);

intsprintf(char*str,constchar*format,・・•);

intsnprintf(char*str>size」size,constchar*for-

mat,・・.);

#include<stdarg・h>

intvprintf(constchar*format.,va_lista.);

intvfprintf(FILE*stream,constchar*format,

方以看到printf后面有个3,所以也可以直接输入以下命令:

[chenzongquan]$man3printf

一般情况下,标准C的函数都是数字3。严格地说,应该写成下面的形式:

[chenzongquan]$man-s3printf

linux中,写s,unix中,写S。

printf:按格式打印;print-打印,f表示格式。其中,双引号包起来的叫字符串,可长可

短,原样输出,除非有特殊含义,如转义字符。

printf(格式字符串,表达式1,表达式2,…);

【用表达式替换格式字符串中的占位符%;如果没写表达式,占位符会随机找数据来替

换;如果没有格式占位符,后面的表达式就没用处】

在stdio头文件中声明了printf,所以需包含头文件stdio.h。

单引号包起来的叫字符,单引号只能包一个字符,不能包多个,也不能一个都不包,但

是还存在一些转义字符,如'\n’,也是一个字符,表示newline,换一行。

用“\”打头的字符都有特殊含义,称为转义字符。

表3-3转义字符及其作用

字符形式含义ASCII代码

\n换行,将当前位置移到下一行开头10

\t水平制表(跳到下一个Tab位置)9

\b退格,将当前位置移到前一列8

\r回车,将当前位置移到本行开头13

\f换页,将当前位置移到下页开头12

w代表一个反斜杠字符“\”92

\'代表一个单引号(撤号)字符39

\"代表一个双引号字符34

\ddd1到3位八进制数所代表的字符

\xhh1到2位十六进制数所代表的字符

输入回车键其实相当于输入了一个换行符。而上是回车符,回到本行最左边,它并不换

行。

|root@192cl|#viabc

printf("大家好!\n");

printf(”祝大家好运!\n");

【在c程序的末尾最好留一个空行,因为不留空行,有些编译器给警告】

|root@192cl|#vihello.c

#include<stdio.h>

intmain()

printf(nhellocsdl007!\nH);

#include"abc"【把另一个文件的内容插进来】

return0;

|root@192cl|#catabc

printf("大家好!\n°);

printf(”祝大家好运!\nM);

[root@192cl|#geehello.c

[root@192cl|#a.out

hellocsdl007!

大家好!

祝大家好运!

[root@192cl|#

■基本数据类型

程序运行时,所有的数据都放在内存中。为了使用起来方便,我们可以给某些内存区域

取一个名字,这就是所谓的变量。变量用来存放数据,数据有不同的类型,所以变量必须有

类型。int是整型;char是字符型;char口是字符数组,存放一组字符,不同于字符串,字符

串是以\0为结束标志的一组字符。定义了变量,这个变量就有了数据,如果不给其赋值,里

面存的就是垃圾数据。

整型:int

字符型:char

实型:float,double【float一般精确到7位有效数字,double一般是15位】

还有非标准的类型:longdouble【有些编译器不支持,精度能达到30多位】

char类型变量占1个字节;int、long和float占4个字节,double占8个字节。

基本数据类型罗列:

char,unsignedchar【可以表示0~255】,signedchar【可以表示-128-127](这两个对字

符本身没有任何意义,主要是用来存放整数时用到),默认的是signedchar。

int,unsigned(int),(signed)int,short(int)【2个字节】,unsignedshort(int)»signed

short(int),long(int)>signedlong(int),unsignedlong(int)>longlong【8个字节】。

float,double,longdouble(无unsigned,实数总是可正可负的)。

void(空类型,不确定类型,没有用void定义的变量,它有其他用途)

规定新类型的方法:enum(枚举),struct(结构体),union(联合体),array(数组),

pointer(指针)。

SD卡就是用4个字节设计的存储容量,遗憾的是它设计的时候设成了有符号的,即存

储容量为:-23匚23」(2G),但存储容量是不可能为负的,所以SD卡最大容量就是2G。也

有扩展到4G的SD卡,但如果设备不支持扩展的SD,也没办法识别。

1P=1O24T;1T=1O24G;

1G=1024M=1024*1024KB=1073741824字节=23°字节:

2G=231字节。

■原码与补码

整数在计算机中用二进制来表示,最高位表示符号位,最高位为0表示非负数,为1

就表示是负数。比如一个字节有八位二进制位:非负数可以表示出0~127,负数可以表示

出-1--128(因为没有-0,所以多增加一个,至上128)。如果是无符号的八位二进制位,可

以表不0~255<>

以前的计算机用原码的方式存放数据,比如-1,在计算机里表示为:10000001;但这种

方法使得计算起来很麻烦。

所以现在的计算机采用补码的方式存数据:非负数的补码与原码相同,负数的补码是对

应的正数的原码按位取反再加1。比如-1,它对应的整数1的原码为00000001,按位取反后

11111110,再加1就是11111111。这样在进行运算就简单了,比如-1+1,最高位的1溢出,

结果就是0。

如果知道一个负数,比如11111111,将它按位取反再加1就可以知道它表示的是负几。

再比如10000000,就是-128。

小数是按照指数形式存储的,小数都会被化为数值乘以2的n次方,比如0.45*23,45

叫做尾数,3叫做阶码。整数的表示是精确的,小数的表示只能是近似的。比如1000010.0001

相加,结果可能不是1.0。一般也不直接比较两个小数是否相等,一般用fabs(a-b)<le-5,fabs

是取绝对值函数。[le-5或1E-5,表示1*10-5,e(E)之前必须有数字,之后的指数必须为

整数】

float存储方式为:符号位(1位)+阶码(8位)+尾数(23位)。

double存储方式为:符号位(1位)+阶码(11位)+尾数(52位)。

■ASCII码

每个字符都有自身对应着的ASCII码,如:'a'就是97(0x61),'b'是98,'z'是

122(0x7a);'A'是65(0x41),'B'是66,'Z'是90(0x5a);'0'是48(0x30),'1'

是49,'9'是57(0x39);空格字符是32(0x20);回车字符上是13;换行符\n是10;制

表符\t是9。

ASCH码的范围是0~127;ASCH码为32及32以下的字符都是看不见的字符。ASCII

码为0的字符叫空字符,有个特殊的表示方式:'\0’,它被赋予了特殊的含义:作为字符串

的结束标志。

ASCIIControlASCHASCIIASCII

valueCharactercharactervalueCharactervalueCharactervalueCharacter

000(null)032(space)064@096

001o0331065A097a

002■034066B098b

003,035“067C099c

004036$068D100d

0054.037%069E101e

006A038&070F102I

007(beep)039071G103g

008a040(072H104h

009(tab)041)0731105i

010(linefeed)042,0741106j

Oil(home)043075K107k

012(formfeed)044076L!081

013(carriageroturn)045-077109m

014C046078110n

0150SI047079111o

016一DLE0480080112P

017VDC10491081!13q

018:DC20502082114r

0191!DC30513083115s

020ITDC405240841161

021§NAK0535085117u

022MMSYN0546086118V

0231ETB0557087119w

024tCAN0568088120X

025EM0579089I2iy

026SUB058090122z

027*—ESC0590911231

028(cursorright!FS060<092124

029(cursorleft)GS061093125

030(cursorup)RS062>094126

031(cursordown)US063?095127a

,*>.・**«Can(•,,,!("l*t>>Cil(<1(•

■常量与变量

♦内存

♦程序的内存使用

•常量(不变的变量,放在内存空间中,放进去后就不允许改变了)

•字面量(直接的数据,如20,'x',"abc”:inta=l,a是变量,1是字面量)

•变量

•动态内存

♦变量的类型(一个变量有类型,名字和数值;一个变量的类型、地址、名字终生不

变)

■变量与数据类型

♦先声明,后使用

♦C编译器对变量声明的处理

编译器会对声明的变量规划一块内存空间,在运行时变量才真正得到空间。

规划的空间大小由变量类型决定,与具体数值无关。

■变量与变量的size

♦变量都有类型

♦变量在内存中的大小:

sizeof(类型),sizeof(变量),sizeof(数值),sizeof(表达式);

返回的是字节数:

sizeof只关心类型,不关心数值;

sizeof(数值):数值如果写的是整数,会被当成int类型;小数会被当成double类型。

sizeof(表达式):只关心数据类型,只会分析括号中的类型,不会对括号中的内容

进行运算,只看如果算了最终会是什么类型。

如果写一个小数,希望它是float类型,就加个f,如3.14f;希望它是10ngdouble

类型的,就写成3.14L或3.141,但尽量用大写,容易区分。

整数也是一样,比如35L,表示是longint类型;35LL,表示是longlong类型。

C语言没有专门用来表示真假的数据类型,C语言用数值来表示真假,非零数值表

示真,NULL、0、'\0'为假。

反之,如果为真,就当成数值1;如果为假,就当成数值0。

■类型转换

c语言有自动类型提升机制。进行运算时:

char、short类型都会提升成int类型,float类型会提升成double类型再做运算;

int和unsignedint进行混合运算时,首先将int转换成unsignedint然后参与运算;

如果有整数和小数的混合运算,整数会转换成小数double。

#include<stdio.h>

intmain()

charc=0xcd;

printf("%d,%x\n”,c,c);

return0;

[root@192c2]#a.out

-51,ffffffcd【带符号扩展,Oxcd的最高位为1,char提升为int时,前面的24位都是1】

■范例

#include<stdio.h>

intmain()

(

printf(Mhello,data!\n");

printf(naaa%ibbb%fccc%cddd\nu);

return0;

)

[root@192cl|#gccprintf.c

[root@192cl|#a.out

hello,data!

aaa-1075708976bbb0.000000ccc^ddd

%:称为格式占位符,%打头的都会依次被后面的数据代替。

%i、%f、%(:都被别的数据代替了。

[root@192cl|#viprintf.c

改为:printf(naaa%ibbb%fccc%cddd\n'\l23,45.6,宜);

[root@192cl|#gccprintf.c

[root@192cl|#a.out

hello,data!

aaal23bbb45.600000cccaddd

%4或%(1:int【i表示int;d表示十进制】

%hd或%1出shortint/longint

%u:unsignedint

%£或%1色float/double

%c:char

%s:"字符串”

%、或%0:无符号的十六进制/无符号的八进制

【自己写十六进制数时,加Ox,如0x2FA:八进制,加0】

%e:以指数的形式输出浮点数

%p:变量地址

%g:float/double在f和e之间选择一个较短格式输出,去掉了尾随的零

#include<stdio.h>

intmain()

(

printf(“十六进制%x,八进制%o\n”,763,763);

return0;

)

[root@192cl|#a.out

十六进制2fb,八进制1373

>dayO2AM(变量常量)

■c的保留字

auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,

if,int,long,printf,register,return,scanf,short,signed,sizeof,static,struct,switch,typedef,union,

unsigned,void,while,...

■c变量名

♦变量名(identifier)

•只能使用字母,数字,或下划线

•第一个字符必须是字母或下划线(不能是数字,如5L,表示long型数值)

•中间不能断开

•不能是保留字,不能与全局函数和数据类型同名

♦C严格区分大小写(UNIX中...)

♦使用易懂的变量名,最好能见名知意(一般是相关的英语单词或者缩写)

♦长度一般不要超过32个字符

不单是变量名,所有需要自己起名的地方都需要遵守这样的规则。

■vi初始化文件

vi的初始化文件是主目录下的.exrc文件。可以在vi的编辑模式下用命令setall查看可

以设置的所有东西。

$vi~/.exrc

:setall

选项

aleph=224noiconnoshowcmd

noarabiciconstring=noshowfulltag

arabicshapenoignorecasenoshowraatch

noallowrevinsiminsert=Oshowmode

noaltkeymapirasearch=Oshowtabline=l

ambiwidth=singleincludeexpr=sidescroll=0

noautochdirnoincsearchsidescrolloff=0

noautoindentindentexpr=nosmartcase

noautoreadnoinfercasenosmartindent

noautowritenoinsertmodenosmarttab

noautowriteallisprint=©,161-255softtabstop=0

background=lightJoinspacesnospellT

nobackupkey=spellfile=

backupcopy=autokeymap=spelllang=en

backupext=~keymodel=spellsuggest=best

backupskip=/tmp/*keywordprg=mannosplitbelow

nobinarylangmap=nosplitright

nobomblangmenu=startofline

bufhidden=laststatus=lstatusline=

——更多——

文件(E)编瑁也)查看Q)终端Q)

setnu

setts=4

setnu:设置显示行号;

setts=4:设置一个tab键跑4个字符。

■变量声明

任何变量在使用之前必须进行声明。变量声明类似于下面这种形式:

数据类型变量名称;

比如:intx;也可以一次性声明多个同类型变量:floaty,z;

对变量可以进行初始化,也可以在之后对它赋值。

早期的C编译器有个规定:变量声明必须放在最前面。但现在很多编译器无此规定。

[root@192c2|#viinit.c

#include<stdio.h>

intmain()

(

doubleincome;〃垃圾数据

shortintpen,notebook;//垃圾数据

printf(npen=%hd,notebook=%hd\nH,pen,notebook);

printf(Mincome=%hd\nn,123);

return0;

)

[root@192c2|#gccinit.c

[root@192c2|#a.out

pen=-28684,notebook=38

income=123

[root@192c2)#

改为:printf(,,income=%hd\n",123.0);

[root@192c2]#gccinit.c

[root@192c2|#a.out

pen=20468,notebook=200

income=0

[root@192c2|#viinit.c

#include<stdio.h>

intmain()

(

doubleincome;〃垃圾数据

shortintpen,notebook;〃垃圾数据

intage=40;〃指定值初始化

doublesalary=1234.56,weight=78.9;〃指定值初始化

printf("pen=%hd,notebook=%hd\n",pen,notebook);

printf("income=%lf\nu,income);

printf("age=%d\nH,age);

printf(nsalary=%lf,weight=%lf\nn,salary,weight);

age=18;〃赋值,用的时候直接用名字,不用再加类型

printf("age=%d\n",age);

age=age-10;〃赋值

printf(nage=%d\n",age);

return0;

)

|root@192c2]#gccinit.c

[root@192c2|#a.out

pen=10824,notebook=-16499

income=0

age=40

salary=l234.560000,weight=78.900000

age=18

age=8

[root@192c2)#

[root@192c2|#vitype.c

#include<stdio.h>

intmain()

(

intn=12345.6;

doubled=1.5e30;

printf(Mn=%d\n\n);〃小数部分直接截断

printf(Mn=%f\n",n);〃变量n是整型数据

return0;

)

[root@192c2|#gcctype.c

[root@192c2|#a.out

n=12345

n=-0.020396

[root@192c2|#

添加语句:

n=1.5e30;〃会将数值转换为int类型(隐式转换),结果会溢出

printf("n=%d\n",n);

|root@192c2|#gcctype.c

type.c:Infunction'main’:

type.c:9:警告:隐式常量转换溢出

[root@192c2|#a.out

n=12345

n=-0.007939

n=2147483647〃实际是2G-1,2G用十六进制表示就是

|root@192c2|#

[root@192c2|#vitype.c

#include<stdio.h>

intmain()

intn=12345.6;

doubled=1.5e30;

printf(Mn=%d\n,\n);〃小数部分直接截断

printf(nn=%f\n",n);〃变量n是整型数据

n=(int)1.5e30;〃强制转换;这样不会有警告

printf("n=%d\nH,n);

printf(Mn=%x\nu,n);

printf("%d\n",(int)d);〃类型转换转换的是数值,不会改变变量类型

printf("dasdouble:%g\n",d);

printf("dasinteger:%d\n';d);

return0;

)

[root@192c2|#geetype.c

[root@192c2]#a.out

n=12345

n=-0.020396

n=2147483647

n=7fffffff

-2147483648

dasdouble:1.5e+30

dasinteger:-348624465

[root@192c2|#

[root@192c2|#visizeof.c

#include<stdio.h>

intmain()

(

intn=10;

printf(n%i\n",sizeof(int));

printf("%i\n",sizeof(n));

printf(',%i\nM,sizeof(n+5));

printf(',***%i\nn,sizeof(n+5.5));//5.5为double类型,最终是double类型数据,不会计算

printf("%i\n”,sizeof(n=123));〃只关心数据类型,不做计算,只会分析类型

printf(nn=%i\n,'»n);

return0;

)

|root@192c2|#gccsizeof.c

[root@192c2|#a.out

4

4

4

***8

4

n=10

[root@192c2)#

查看汇编代码:

[root@192c2|#gcc-Ssizeof.c

|root@192c2|#Is

a.ca.outconst.clogic.csizeof.ctype.c

address.cbits.cinit.cppmm.csizeof.§

[root@192c2|#rm-fa.out

[root@192c2|#gccsizeof.s【可以直接编译】

[root@192c2|#a.out

4

4

4

***8

4

n=10

[root@192c2|#visizeof.s

.file"sizeof.c"

.section.rodata

.LCO:

.stringn%i\nr,

.LC1:

.string"***%i\n"

.LC2:

.stringnn=%i\nn

.text

.globlmain【全局main]

.typemain,@function【main的类型是函数】

main:

leal4(%esp),%ecx

subl$36,%esp

movl$10,-8(%ebp)【对应intn=10;]

movl$4,4(%esp)

movl$.LC0,(%esp)

callprintf

movl$4,4(%esp)

movl$.LC0,(%esp)

callprintf

movl$4,4(%esp)

movl$.LC0,(%esp)

callprintf

movl$8,4(%esp)

movl$.LC1,(%esp)

callprintf

movl$4,4(%esp)

movl$.LC0,(%esp)

.idem”GCC:(GNU)4.1.220080704(RedHat4.1.2-54)"

.section.note.GNU-stack/'",@progbits

■常量

♦常量与常量的数据类型

♦constdoublePI=3.14;(加const就表示变量是不可变的,常量必须给其初始值)

const

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论