2021-09-08 C语言 数据类型、常量、变量及运算符

本文详细介绍了C语言中的数据类型,包括逻辑类型、整数类型、浮点类型和void类型,并讲解了强制类型转换的概念。接着,讨论了各种常量,如整型、浮点型、字符型、字符串型和标识常量。此外,还阐述了变量的基础知识,变量的存储类型(auto、register、static、extern)及其作用。最后,概述了运算符,包括算术、关系、逻辑、位运算符以及赋值运算符等。

Day2数据类型、常量、变量及运算符
数据类型
1.数据类型的分类
在这里插入图片描述

2.基本数据类型
<limits.h>头文件查看数据类型长度
逻辑类型:只有两个量true和false,表示逻辑真值和逻辑假值(bool类型)
整数类型:包括char、short、int和long
浮点类型:包括float和double
void类型:主要用于说明不返回值的函数或指向任意类型的指针等
在这里插入图片描述

3.强制数据类型转换
强制数据类型转换是指采用某种方式将某种数据类型强制转换成指定的数据类型。包括显示数据类型转换和隐式数据类型转换。
例:

int a=22 , b=0 ;
float c=24.87 , d=3.3 ;
b = (int) (a+c+d) ; //b的值为50

注:
强制类型转换符后面的表达式如存在复杂运算,就一定要用小括号括起来。
强制类型转换是一种不安全的转换,一般是将高级类型转换成低级类型,要丢失数据精度。
强制数据类型转换并不一定改变表达式中变量的数据类型和其值。

常量
1.常量是指在程序运行期间其数值不发生变化的数据
1.1.整型常量:整型常量通常简称为整数(十进制、八进制、十六进制)。
1.2.浮点常量:浮点常量又称为实数,一般含有小数部分,在C语言中实数只有十进制,分为单精度和双精度。有两种表示方法:一般形式(3.5,-12.5,3.1415926)和指数形式(指数常量)。%f输出打印浮点数,格式[+|-]M.N。
1.3.指数常量:指数形式的实数一般是由尾数部分、字母部分(e或E)和指数部分组成。格式[+|-]M.N<e|E>[+|-] 例:1.176e+10表示1.176*10^10
1.4.字符常量:字符常量是指单一字符、其表示形式是由两个单引号包括的一个字符。例:’ A ’ , ’ a ’ , ’ 0 ’ , ’ + ’ , ’ : ’ , ’ ? ’ , ’ $ ’都是字符常量。%c输出打印字符,%d输出打印字符的ASCⅡ码值。
在C语言中字符常量具有数值且值就是该字符的ASCⅡ码值。
例:

char a , b , u , v ;
a = ' f ' ; //将a赋值70
b = ' A ' + 2 ; //b存放的是'C'字符(65+2)
u = '  ' + ' B ' ; //u存放的是'b'字符(32+66)(大小写转换)
v = ' b '- 32 ; //v存放的是'B'字符(97-32)(大小写转换)
数字字符转化为数字值:(48在ASCⅡ码中代表’0’)
char ch1 = ' 8 ' ;
int num ;
num = ch1 - 48 ;

1.5.字符串常量:字符串常量是指用双引号括起来的一串字符来表示的数据(字符串以”\0”结尾,即” 9 ” = ‘ 9 ‘ + ‘ \0 ‘)%s输出打印字符串。
例:” Hello! “ , “ Student “ , “ 9 “ , “ LINUX “ , “ 李四 “……
1.6.标识常量:标识常量是指用标识符代替常量使用的一种常量,其名称通常是一个标识符也叫符号常量,一般用大写字母书写,在使用前必须预先定义。
定义格式: #define <标识常量名称> <常量>
例:

#define MAX 50
#define PI 3.1415926
#define NULL 0
#define EOF -1
#define ERROR -1

定义一个宏名字,可以在其他宏定义中使用。
例:

#define ONE 1
#define TWO ONE+ONE

如果一个串长于一行可在行尾用反斜线”\”读行。
例:

#define LONG_STRING “this is a very very long string that is used as \
an example “

1.7.宏定义函数
在软件开发过程中,经常有一些常用或者通用的功能或代码段,封装成为宏定义。
例:

#define MAX ( a, b ) ( ( a ) > ( b ) ? ( a ) : ( b ) )int max ( int a , int b )
{
	return ( a > b ? a : b )
}

有一些任务根本无法用函数实现,但是用宏定义却可以,比如参考类型传递给带参的宏。
例:

#define MALLO ( ( n.type ) \ ( ( type * ) malloc ( n ) * sizeof ( type ) )

1.8.案例
一个水分子的质量约为3.0*10-23g,1夸脱水大约有950g,编写一个程序,要求输入水的夸脱数,然后显示这么多水中包含多少水分子。

#include <stdio.h>
#define W 3.0e-23
#define C 950

int main(int argc, char *argv[])
{
        float n, total;
        printf("please input:");
        scanf("%f", &n);
        total = n * C / W;
        printf("%e\n", total);
        return 0;
}

变量
1.变量基础

  1. 变量名由字母、数字、下划线组成,不能以数字开头,不能和C的关键字重名。
  2. 在程序运行时,变量占据存储空间的大小由其数据类型决定。
  3. 变量在内存空间中的首地址成为变量地址。

2.变量的说明
变量在程序中使用时必须预先说明它们的存储类型和数据类型。
一般格式:<存储类型> <数据类型> <变量名>
<存储类型>是关键字auto、register、static和extern。
<数据类型>可以是基本数据类型,也可以是自定义的数据类型。
3.变量的存储类型
3.1. auto
auto说明的变量只能在某个程序范围内使用,通常在函数体内或函数中的复合语句里(默认是随机值,说明时可省略关键字auto)
例:

auto int k ; int j ;

3.2. register
register称为寄存器型,register变量是想将变量放入CPU的寄存器,这样在变量使用次数过多时,可以加快程序运行速度,如果申请不到就使用一般内存(同auto)。register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值并且长度小于或等于整型长度。
不能用”&”来获取register变量的地址(变量直接存于寄存器中)
3.3. static
static变量称为静态存储类型的变量,即可以在函数体内也可以在函数体外说明(默认为0)。
局部变量使用static修饰有以下特点(通常局部变量默认随机值,全局变量默认0):

  1. 在内存中以固定地址存放的,而不是以堆栈方式存放(不是自动分配自动回收)。
  2. 只要程序没结束就不会随着说明它的程序的结束而消失,它下次再调用该函数,该存储类型的变量不再重新说明,而且还保留上依次调用存入的值。

3.4. extern
当变量在一个文件中的函数体外说明(全局变量),所有其他共同编译的文件中的函数或程序段都可以引用这个变量,extern变量成为外部参照引用型,使用extern说明的变量是像引用在其他文件中函数体外部说明的变量即说明使用其他文件中的全局变量,使用格式:extern int global_a ; 使用时应将多个文件联合编译。
static修饰的全局变量在其他文件无法使用。

运算符
1.算术运算符
在这里插入图片描述

2.关系运算符
在这里插入图片描述
成立为1(true)不成立为0(false)
3.逻辑运算符
在这里插入图片描述
3.1. &&运算规律
在这里插入图片描述
3.2. ||运算规律

4.位运算符

4.1. 位逻辑反”~ “运算符的运算规律(取反):
例:

unsigned char x = 0x17 , y ;
y = ~x ; 
计算机内存中的x内容如下:
00010111
y被赋值后的计算机内存中的内容如下:
11101000
y赋值结果为:0xE8

4.2. 位逻辑与”&”运算符的运算规律:
在这里插入图片描述
例:

unsigned char x = 0126 , y = 0xac , z ;
z = x & y ;
x&y位逻辑与运算:
左运算量:01010110 右运算量:10101100
&结果:00000100
z赋值结果:0x04

4.3. 位逻辑或”|”运算符运算规律:
在这里插入图片描述
例:

unsigned char x = 076 , y = 0x89 , z ;
z = x | y ;
x|y位逻辑或运算:
左运算量:00111110 右运算量:10001001
|结果:10111111
z赋值结果为:0xbf

4.4. 位逻辑异或”^”运算符的运算规律:
在这里插入图片描述
例:

unsigned char x = 75 , y = 0173 , z ;
z = x ^ y ;
x^y的位逻辑异或运算:
左运算量:01001011 右运算量:01111011
^结果:00110000
z赋值结果为:060

4.5. 位移运算符的一般形式:
<运算量> <运算符> <表达式>
其中<运算量><表达式>必须为整型结果数值,<表达式>为左移位”<<”或右移位”>>”运算符。
例:

unsigned char a = 0xe4 , b ;
b = a << 3 ;
运算量a左移位3位存入b的情况:
左运算量:11100100
<<结果:00100000
b赋值结果为:0x20
右移位同理。

4.6. 思考
(1)如何把一个无符号数的某位快速置1?

|”运算符,将需要置1的位填1其余填0。
设x为无符号数,y为位数,x = x | ( 1 <<( y - 1 ) )

(2)如何把一个无符号数的某位快速清0?

&”运算符,将需要清0的位填0其余填1.
x = x & ( 1 << ( y - 1 ) )

(3)如何利用位运算把一个十进制数转化成一个十六进制数?

b = a / 16 即b = a >> 4 , b = a % 16 即b = a & 0xf(00001111)

5.赋值运算符
5.1. 赋值运算符为”=”,其运算的一般格式如下:
<左值表达式> = <右值表达式>
5.2. 赋值复合运算符其运算的一般形式如下:
<变量> <操作符> = <表达式>
在这里插入图片描述
6.C语言的特殊运算符
6.1. 条件运算符” ? : “
是三目运算符,其运算的一般格式:

<表达式1> ? <表达式2> : <表达式3>

表示如果表达式1成立则执行表达式2,否则执行表达式3。
例:

int x = 82 , y = 101 ;
x >= y ? x + 18 : y - 100 ; //结果为1
x < ( y - 1 ) ? x - 22 : y - 1 ; //结果为60

6.2. 逗号运算符
例:

(1)float x = 10.5 , y = 1.8 , z = 0 ;
(2)z = ( x = y = 5 , x += 1 , y = x + 0.2 ) //z赋值结果为6.2
从左到右执行,整个表达式的值为括号内最后一个表达式的值,即y = x + 0.2

6.3. sizeof运算符
运算的一般格式:

sizeof(<类型或变量名>)

注:它只针对数据类型,而不针对变量!
例:

sizeof(double) ; sizeof(long) ;

7.C运算符的优先级
在这里插入图片描述
例:

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值