c语⾔中什么运算符可以求出数据字节数,C语⾔的数据类型及
其运算符
⼀、数据类型
(⼀)、变量与常量
1、变量
(1)、定义:其值在其作⽤域内可以改变的量称为变量。⼀个变量应该有⼀个名字,在内存中占据⼀⼀定的存储空间。变量在使⽤前必须要定义,每个变量都有⾃⼰的地址。变量依据其定义的类
型,分为不同类型,如整型变量、字符型变量、浮点型变量、指针型变量等。变量的值可以发⽣改变,意味着它可以被覆盖、被写⼊、被赋值。每个变量必须要有⼀个名字和它所在内存空间绑定。
(2)、变量名和变量值
①、变量名是在变量的声明的时候,该名字就和内存中⼀块地址绑定在⼀⼀起了。可以通过变量名直接到对应的内存区域,也可以通过地址到其内存区域。
②、变量的值是变量所对应的内存区域内存放的⼆进制序列,变量的值不会因为变量的类型发⽣了改变⽽改变,当变量被转换为对应类型时,内存区域的⼆进制序列以该类型的形式翻译出来。这也是强制类型转换能够成⽴的原因。
(3)、局部变量和全局变量
函数形参变量只有在被调⽤期间才能分配内存单元,调⽤结束⽴即释放。这⼀点表明形参变量只有在函数内才是有效的,离开该函数就不能再使⽤了。这种变量有效性的范围称为变量的作⽤域。不仅对于形参变量,C语⾔中所有的量都有⾃⼰的作⽤域。变量说明的⽅式不同,其作⽤域也不同。C语⾔中的变量,按作⽤域范围可分为两种,即局部变量和全局变量。
①局部变量
a、定义:局部变量也称为内部变量,局部变量是在函数内作定义说明的,其作⽤域仅限于函数内,离开该函数后再使⽤这种变量是⾮法的。
b、关于局部变量的作⽤域还要说明以下⼏点。
(a)、主函数中定义的变量也只能在主函数中使⽤,不能在其他函数中使⽤。同时,主函数中也不能使⽤其他函数中定义的变量。因为主函数也是-⼀个函数,它与其他函数是平⾏关系。这⼀点是与其他语
⾔不同的,应予以注意。(b)、形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。(c)、允许在不同的函数中使⽤相同的变量名,它们代表不同的对象,分配不同的单元,互不⼲扰,也不会发⽣混淆。例如,在前例中,形参和实参的变量名都为n,是完全允许的。(d)、在复合语句中也可定义变量,其作⽤域只在复合语句范围内。
②全局变量
全局变量也称为外部变量,它是在函数外部定义的变量,它不属于哪⼀个函数,它属于⼀个源程序⽂件,其作⽤域是整个源程序。在函数中使⽤全局变量,⼀般应作全局变量说明,只有在函数内经过说明的全局变量才能使⽤。全局变量的⼀说明符为 extern,但在⼀个函数之前定义的全局变量,在该函数内使⽤可不再加以说明。
2、常量
(1)、定义:其值不会发⽣改变的量称为常量,它们可以和数据类型接合起来分类,如整型常量、浮点型常量,字符常量等。常量是可以不经过定义和初始化,⽽直接引⽤的,常量⼜分为直接常量和符号常量,直接常量⼜叫作字⾯常量,如12,0,446,‘a’,"abed”;符号常量,如宏定义的“ #define PI 3.14“常量的值在其作⽤域内不会发⽣改变,也不能再被赋值,在其出现时就被当作⼀个⽴即数来使⽤。也就是说,它只能被访问、被读,⽽不能被写、被赋值。
(⼆)、基本内置类型
1、基本内置类型有哪些?
(1)整型
整型共有6种:①、带符号整型(int)、②带符号短整型( short int)、③带符号长整型(long int或long)
④⽆符号长整型( unsigned long)、⑤⽆符号整型( unsigned int)、⑥⽆符号短整型( unsigned short int)
(2).实型
实型数据有表⽰范围和精度两个不同的特征,为了适应数的范围和精度的不同要求,实型数据分三种类型:单精度型(float,也称为浮点型)、双精度型( double)、长双精度型(long double)
(3).构造类型
构造类型是指由若⼲个相关的数据组合在⼀起形成的⼀种复杂数据类型,构造数据类型的成分数据可以是基本数据类型的,也可以是别的构造类型的。按构造⽅式和构造要求区分,构造类型主要有数组类型、结构类型和共⽤类型。数组类型是由相同类型的数据组成;结构类型可以由不同类型的数据组成;当不同数据类型不会同时使⽤时,以节约内存,让不同数据占⽤同⼀区域,这就是共⽤类型。
(4).指针类型
指针类型是取程序对象(如变量)在内存中占据的地址为值的⼀种特殊的数据类型。
(5).枚举类型
枚举类型来表⽰。如变量表⽰⼀个星期中的某⼀天,就可⽤校举类型描述该变量的类型,并以星期⼏的英⽂名对⽇期命名,对应的变量取某⽇的星期名称为其值。
(6),void类型
⽤保留字void表⽰的数据类型有两种完全相反的意思,可以表⽰没有数据(没有结果没有形式参数),也可以表⽰某种任意类型的数据(如⼜与指针结合,⽤void标起)。void表⽰空类型,void表⽰任意类型的指针类型,若使⽤void类型的数据,应该将它强制的转换成某种具体的指针类型。
(三)、声明与定义
1、什么是定义?
所谓的定义就是(编译器)创建⼀个对象,为这个对象分配⼀块内存并给它取上⼀个名字,这个名字就是
我们经常所说的变量名或对象名。但注意,这个名字旦和这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊),它们就同内(如函数内、全局等)只能被定义⼀次,如果定义多次,编译器会提⽰你重复定义同⼀个 ⽣共死,终⽣不离不弃,并且这块内存的位置也不能被改变。⼀个变量或对象在⼀定的区域变量或对象。
2、什么是声明?
有两重含义:
第⼀重含义:告诉编译器,这个名字已经匹配到⼀块内存上了,上⾯第2⾏代码⽤到变
量或对象是在别的地⽅定义的。声明可以出现多次。
第⼆重含义:告诉编译器,我这个名字我先预定了,别的地⽅再也不能⽤它来作为变量名或对象名。例如,你在图书馆⾃习室的某个座位上放了⼀本书,表明这个座位已经有⼈预订,别⼈再也不允许使⽤这个座位。其实这个时候你本⼈并没有坐在这个座位上。这种声明最典型的例⼦就是函数参数的声明,如“ void fun(int i, char c);”
(四)、static与extern
1、static修饰变量,就是指该变量空间独⽴于函数中的auto变量或者栈变量,static变量空间在内存中的静态区内分配
2、extern是指当前变量或函数不是在本源⽂件内声明的,它是外部变量或外部函数,正所谓“外来的和尚会念经”,能很好地体现 extern 的价值。当我们在本⽂件⾥试图引⽤⼀个外部声明的全局变量或函数时,可以在其前⾯加上 extern,表⽰它是外来“和尚”
extern可以修饰变量和函数,表⽰该变量或者函数在其他地⽅被定义
(五)、const
变量前⽤const修饰,以为该变量⾥的数据只可以访问,不能被修改
(六)、auto
意味着当前变量的作⽤域为当前代码的局部变量,即当前代码会在內栈上进⾏分配
(七)、register
1、作⽤
如果⼀个变量被 register来修辞,就意味着该变量会作为⼀个寄存器变量,让该变量的访问速度达到最快。例如,⼀个程序逻辑中有⼀个很⼤的循环,循环中有⼏个变量要频繁进⾏操作,这些变量可以声明为 register类型。
2.寄存器变量:指⼀个变量直接引⽤寄存器,也就航是对变量名的操作的结果是直接对寄存器进⾏访问。
(1)、注意:①待声明为寄存器变量类型应该是CP寄存器所能接收的类型,意味着寄存器变量是单个变量,变量长度应该⼩于等于寄存器长度。
②不能对寄存器变量使⽤取地址符“&”,因为该变量没有内存地址。
③尽量在⼤量频繁操作时使⽤寄存器变量,且声明的变量个数应该尽量少
(⼋)、volatile
它修饰的变量表⽰该变量的值很容易由于外部因素发⽣改变,强烈请求编译器要⽼⽼实实地在每次对变量进⾏访问时去内存⾥读取
(九)、typedef:在编程中使⽤ typedef⽬的⼀般有两个:⼀个是给变量⼀个易记且意义明确的新名字,另个是简化⼀些⽐较复杂的类型声明
1、typdef与#define的问题:
(1)、在有指针的场合⾥typdef⽐#define要好
(2)、①#define宏定义有⼀个特别的长处:可以使⽤#idef、#ifndef等来进⾏逻辑判断,还可以使⽤#undef来取消定义。
②typedef也有⼀个特别的长处:它符合范围规则,使⽤ typedef定义的变量类型,其作⽤范围限制在所定义的函数或者⽂件内(取决于此变量定义的位置),⽽宏定义则没有这种特性
2、 typedef与复杂的变量声明
遇到⽐较复杂的变量声明,使⽤ typedef作简化⾃有其价值。
(⼗)、枚举
1、枚举与# define宏的区别
(1)# define宏常量是在预编译阶段进⾏简单替换 ,枚举常量则是在编译的时候确定其值。
(2)⼀般在编译器⾥,可以调试枚举常量,但是 不能调试宏常量
(3)枚举可以⼀次定义⼤量相关的常量,⽽defi ne宏⼀次只能定义⼀个。留两个问题:
(1)枚举能做到事,# define宏能不能都做到? 如果能,那为什么还需要枚举?(2) sizeof( Colorva)的值为多少?为什么?
static修饰的变量(⼗⼀)、联合体:联合与结构有⼀些相似之处,但两者有本质上的不同。在结构中各成员有各⾃的内存空间,⼀个结构变量的总长度是各成员长度之和;⽽在联合中,各成员共享⼀段内存空间,⼀个联合变量的长度等于各成员中最长的长度(同样遵循对齐)。应该说明的是,这⾥所谓的共享不是指把多个成员同时装⼊⼀个联合变量内,⽽是指该联合变量可被赋予任⼀成员值,但每次只能赋⼀种值,赋⼊新值则冲去旧值。
1、联合体的定义
union 联合名
{
成员表
};
⼆、运算符、表达式
(⼀)C语⾔的运算符可分为以下⼏类。
1、算术运算符:⽤于各类数值运算,包括加(+)、减(-)、乘()、除(/)、求余(或称模运算,%)、⾃增(++)、⾃减(–),共七种。
2、关系运算:关系运算符:⽤于⽐较运算,包括⼤于(>)、⼩于(=)、⼩于等于(<=)和不等于(!=),共六种。
3、逻辑运算符:⽤于逻辑运算,包括与(&&)、或(|I)、⾮(!),共三种
4、位操作运算符:参与运算的量,按⼆进制位进⾏运算,包括位与(&)、位或(|)、位⾮(~)、位异或(^)、左移(<>),共六种。
5、赋值运算符:⽤于赋值运算,分为简单赋值(=)、复合算术赋值(+=、-=、=、/=、%=、)和复合位运算赋值(&=、|=、^=、>>=、<<=),三类共⼗⼀种。
6、条件运算符:这是⼀个三⽬运算符,⽤于条件求值(??。
7、逗号运算符:⽤于把若⼲表达式组合成⼀个表达式(,)。
8、指针运算符:⽤于取内容()和取地址(&)两种运算。
9、求字节数运算符:⽤于计算数据类型所占的字节数( sizeof)。
10、特殊运算符:有括号()、下标[]、成员(->、.)等⼏种。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论