《C语言程序设计》第二章 基本数据类型

目录:

2.1  常量与变量

  • 2.1.1  常量

  • 2.1.2  变量

2.2  简单的屏幕输出

2.3  数据类型

2.4  如何计算变量或数据类型所占内存空间的大小

2.5  变量的赋值和赋值运算符

2.6  本章扩充内容

2.7  本章知识点小结

2.8  本章常见错误小结


2.1.1  常量

不同类型的整型常量 实例 特点
有符号整型常量 10,-30,0 默认的int型定义为有符号整数,因此对int型无须使用signed
无符号整型常量

30u,

256U

无符号整型常量由常量值后跟U或u来表示,不能表示成小于0的数,如-30u就是不合法的

长整型常量 -256l,1024L 长整型常数由常数值后跟L或l来表示
无符号长整型常量 30lu 无符号长整型常量由常数值后跟LU、Lu、lU或lu来表示

 

不同类型的实型常量 实例 特点
单精度实型常量 1.25F,1.25e-2f 单精度实型常量由常量值后跟F或f来表示
双精度实型常量 0.123,-12.35,.98 实型常量隐含按双精度型处理
长双精度实型常量 1.25L 长双精度型常量由常量值后跟L或l来表示

2.1.2  变量

auto :声明自动变量
break:跳出当前循环
case:开关语句分支
char :声明字符型变量或函数返回值类型
const :声明只读变量
continue:结束当前循环,开始下一轮循环
default:开关语句中的“默认”分支
do :循环语句的循环体
double :声明双精度浮点型变量或函数返回值类型
else :条件语句否定分支(与 if 连用)
enum :声明枚举类型
extern:声明变量或函数是在其它文件或本文件的其他位置定义
float:声明浮点型变量或函数返回值类型
for:一种循环语句
goto:无条件跳转语句
if:条件语句
int: 声明整型变量或函数
long :声明长整型变量或函数返回值类型
register:声明寄存器变量
return :子程序返回语句(可以带参数,也可不带参数)
short :声明短整型变量或函数
signed:声明有符号类型变量或函数
sizeof:计算数据类型或变量长度(即所占字节数)
static :声明静态变量
struct:声明结构体类型
switch :用于开关语句
typedef:用以给数据类型取别名
unsigned:声明无符号类型变量或函数
union:声明共用体类型
void :声明函数无返回值或无参数,声明无类型指针
volatile:说明变量在程序执行中可被隐含地改变
while :循环语句的循环条件
int main(void)
{
    int   a;    //用关键字int指定变量a的类型 
    float b;    //用关键字float指定变量b的类型 
    char  c;    //用关键字char指定变量c的类型 
    a=1;        //为int型变量a赋值整型变量1 
    b=2.5;      //为float型变量b赋值实型变量2.5
    c='A';      //为char型变量c赋值字符型变量'A' 
    return 0;
}
  • 一个C 程序必须且只能有一个用main作为名字的函数,这个函数成为主函数;main后面圆括号内的void表示它没有函数参数;main前面的int表示函数执行后会返回操作系统一个整数型,在main函数的函数体中的最后一条语句使用return语句返回了这个值,通常返回0表示程序正常结束。
  • C语言允许在定义变量的同时对变量初始化(为其赋初值):
int main(void)
{
    int   a=1;      //定义整型变量a并对其初始化 
    float b=2.5;    //定义实型变量b并对其初始化 
    char  c='A';    //定义字符型变量c并对其初始化 
    return 0;
}
  • 如果定义了一个变量,但未对其进行初始化,那么该变量的值是一个随机数(静态变量和全局变量除外)
  • 跨行注释:
#include<stdio.h>
#include<stdlib.h>
 
int main()
{
    printf("char           %d\n",sizeof(char));
    printf("int            %d\n",sizeof(int));
    printf("short int      %d\n",sizeof(short));
    /*若一行写不完注释
    可以用这样的方法写多行注释
    */ 
    return 0;
} 

 

  • 在一条语句中,可同时定义多个相同类型的变量,多个变量之间用逗号作分隔符,其书写的先后顺序无关紧要。
//定义三个整型变量:
int a,b,c;
//在定义变量的同时将其初始化为0:
int a=0,b=0,c=0;
//但是不能写成:
int a=b=c=0;

2.2  简单的屏幕输出

#include<stdio.h> 
int main(void)
{
    int   a=1;    
    float b=2.5;
    char  c='A';
    printf("a=%d\n",a);         //按整型格式输出变量a的值 
    printf("b=%f\n",b);         //按实数格式输出变量b的值 
    printf("c=%c\n",c);         //按字符串格式输出变量c的值 
    printf("End of program\n"); //输出一个字符串 
    return 0;
}


会输出:
a=1
b=2.500000
c=A
End of program
  • 程序第一行以#开头而未以分号结尾的不是C语句,而是C的编译预处理命令;尖括号内的文件称为头文件,h为head之意,std为standard之意,i为input之意,o为output之意;编译预处理命令#include可使头文件在程序中生效,它的作用是:将写在尖括号内的输入/输出函数的头文件stdio.h包含到用户源文件中。
  • 格式字符详解:

    1.d格式字符
    功能:用来输出十进制数
    格式:%d:按整型数据的实际长度输出
    %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
    %ld:输出长整型数据。

    2.o格式字符
    功能:以八进制形式输出整数;
    格式:%o:按整型数据的实际长度输出
    %mo:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
    %lo:输出长整型数据。

    3.x格式字符
    功能:以十六进制形式输出整数
    格式:%x:按整型数据的实际长度输出
    %mx:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
    %lx:输出长整型数据。

    4.u格式字符
    功能:以十进制数输出无符号整数
    格式:%u:按整型数据的实际长度输出
    %mu:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
    %lu:输出长整型数据。

    5.c格式字符
    功能:输出单个字符
    格式:%c:按整型数据的实际长度输出
    %mc:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
    %lc:输出长整型数据。

    6.s格式字符
    功能:输出字符串
    格式:%s:按整型数据的实际长度输出
    %ms:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
    %ls:输出长整型数据。

    7.f格式字符
    功能:以小数形式输出单、双精度实数
    格式:%f:按整型数据的实际长度输出
    %mf:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
    %lf:输出长整型数据。

    8.e格式字符
    功能:以指数形式输出单、双精度实数
    格式:%e:按整型数据的实际长度输出
    %me:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
    %le:输出长整型数据。

    9.g格式字符
    功能:以%f、%e中较短的输出宽度输出单、双精度实数
    格式:%g:按整型数据的实际长度输出
    %mg:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
    %lg:输出长整型数据。

  • 字符串:用一对双引号括起来的若干字符。

2.3  数据类型

 

 

数据类型分类 关键字 变量声明实例 详细章节

整型 基本整型 int int a;

第2章

第4章

长整型 long long int a;       或者    long a;
长长整型 long long long long int a;或者 long long a;
短整型 short short int a;      或者    short a;
无符号整型 unsigned

unsigned int a;

unsigned long a;

unsigned short a;

实型

(浮点型)

单精度实型 float float a;
双精度整型 double double a;
长双精度整型 long double long double a;
字符型 char char a;

第4章

第10章

枚举类型 enum

enum response{no,yes,none};

enum response answer;

第12章

数组

int score[10];

char name[20];

第8章
结构体 struct

struct date

{

      int year;

      int month;

      int day;

};

struct date d;

第12章
共用体 union

union

{

      int single;

      char spouseName[20];

      struct date divorcedDay;

}married;

指针类型

int * ptr;

char * pStr;

第9~11章
无类型 void

void Sort(int array[] , int n);

void *malloc(unsigned int size);

第8章

第11章

  • 定义整型变量时,只要不指定为无符号型,其隐含的类型就是有符号型,而signed通常是省略不写的。

2.4  如何计算变量或数据类型所占内存空间的大小

  •  一个字节(Byte)可以表示的整数最小为0,最大为255,一个字节等于8个二进制位(bit),也称比特。bit是binary digit二进制数的缩写,位是衡量物理存储器容量的最小单位。
英文称谓 中文称谓 字节大小 换算方法
1b(bite) 比特    
1B(Byte) 字节 一个字节 1B=8bit
1KB(Kilobyte) K 一千字节

1KB=1024B=210B

1MB(Megabyte) 百万字节 1MB=1024KB=220B
1GB(Gigabyte) 十亿字节,又称“千兆” 1GB=1024MB=230B
1TB(Terabyte) 万亿字节 1TB=1024GB=240B
1PB(Petabyte) 千万亿字节 1PB=1024TB=250B
1EB(Exabyte) 百亿亿字节 1EB=1024PB=260B
1ZB(Zettabyte) 十万亿亿字节 1ZB=1024EB=270B
1YB(Yottabyte) 一亿亿亿字节 1YB=1024ZB=280B
1BB(Brontobyte)   一千亿亿亿字节 1BB=1024YB=290B
1NB(Nonabyte)   一百万亿亿亿字节 1NB=1024BB=2100B
1DB(Doggabyte)   十亿亿亿亿字节 1DB=1024NB=2110B
#include<stdio.h>
int main(void)
{
    printf("Data type      Number of bytes\n");
    printf("----------     -----------------\n");
    printf("char           %d\n",sizeof(char));
    printf("int            %d\n",sizeof(int));
    printf("short int      %d\n",sizeof(short));
    printf("long int       %d\n",sizeof(long));
    printf("long long int  %d\n",sizeof(long long));
    printf("float          %d\n",sizeof(float));
    printf("double         %d\n",sizeof(double));
    printf("long double    %d\n",sizeof(long double));
    return 0;
} 


输出:

Data type      Number of bytes
----------     -----------------
char           1
int            4
short int      2
long int       4
long long int  8
float          4
double         8
long double    16

 
  • 注:这个程序在不同的操作系统和编译环境下的运行结果可能有所差异。

2.5  变量的赋值和赋值运算符

  • 在计算含有不同类型运算符的表达式时,要考虑运算符的优先级,根据优先级确定运算的顺序,即先执行优先级高的运算,然后执行优先级低的运算。
  • 运算符的结合性:一种是左结合,即自左向右计算;另一种是右结合,即自右向左计算。

C语言中需要两个操作数的算术运算符是左结合的,例如:x/y*z=(x/y)*z。

而赋值运算符则是右结合的,例如:a=b=c=0;与a=(b=(c=0));是等价的<多重赋值>。


2.6  本章扩充内容

  1. 有符号整数和无符号整数

有符号整数和无符号整数的区别在于怎样解释整数的最高位。对于无符号整数,其最高位被C编译器解释为数据位。而对于有符号整数,C编译器将其最高位解释为符号位,若符号位为0,则表示该数为正数;若符号位为1,则表示该数为负数。

  • 原码:将一个整数换算成二进制,就是其原码。
  • 反码:正数的反码就是其原码,负数的反码是除符号位每一位取反(即0变1,1变0)。
  • 补码:正数的补码就是其原码,负数的反码+1就是其补码。

例:(“┊”前为符号位)

-1的原码

1┊0 00 00 00 00 00 00 01

-1的反码

1┊1 11 11 11 11 11 11 10

-1的补码

1┊1 11 11 11 11 11 11 11

如图所示,如果将最高位解释为符号位(有符号竖数),则该数为-1;如果将最高位解释为数据位(无符号数),那么该数就是1*20+1*21+1*22+1*23+1*24+1*25+1*26+1*27+1*28+1*29+1*210+1*211+1*212+1*213+1*214+1*215=65535

  • 在计算机内存中用补码表示负数的原因:首先,可以将减法运算转化为加法运算来处理。eg.将7-6转化为(+7)+(-6)来处理;其次,可以用统一的形式来表示0(否则会出现+0和-0),+0和-0的原码不同,补码相同。

        2.实型数据在内存中的存储格式

 对于实数,无论是小数表示形式还是指数表示形式,在计算机内部都采用浮点形式来储存。

浮点形式是相对于定点形式而言的。所谓定点数是指小数点位置是固定的,小数点位于符号位和第一个数值位之间,它表示的是纯小数;整型数据是定点表示的特例,只不过它的小数点的位置在数值位之后而已。

所谓浮点数是指小数点的位置是可以浮动的数。例如,十进制数1234.56可以写成:1234.56     0.123456*104     1.23456*103  或者  12345.6*10-1,这里随着10的指数的变化,小数点的位置也会发生相应的变化。

通常,浮点数是将实数分为阶码和尾数两部分来表示。例如,实数N可以表示为:N=S*rj.  其中,S为尾数(正负均可),一般规定用纯小数形式;j为阶码(正负均可,但必须是整数);r是基数,对二进制数而言,r=2,即N=S*2j。例如:10.0111=0.100111*210

浮点数在计算机中的存储格式如图所示:

阶码j 尾数S
阶码符号 阶码的数值 尾数符号 尾数的数值
  • 阶码:实数的指数部分;尾数:小数部分。
  • 阶码所占的 位数决定实数的表数范围;尾数所占的位数决定实数的精度,尾数的符号决定实数的正负。
  • 浮点表示法的表数范围远远大于定点表示法,而且也更灵活。

        3.单精度实型和双精度实型的有效位数

//将同一实型数分别赋值给单精度实型和双精度实型变量,然后打印输出 
#include<stdio.h> int main(void) { float a; double b; a=123456.789e4; b=123456.789e4; printf("%f\n%f\n",a,b); return 0; }

输出:

1234567936.000000
1234567890.000000

  • 原因:单精度实型(float型)变量和双精度实型(double型)变量所接收的实型变量的有效数字位数不同。一般而言,double型变量可以接收实型常量的16位有效数字,而float型变量仅能接收实型常量的7位有效数字,在有效数字后面输出的数字都是不准确的。因此,将double型数据赋值给float型变量时有可能发生数据截断错误,从而产生舍入误差。

2.7  本章知识点小结


2.8  本章常见错误小结

常见错误实例 常见错误描述 错误类型
变量未定义就使用 编译错误

int newValue;

newvalue=0;

忽略了变量区分大小写,使得定义的变量和使用的变量不

同名

编译错误

printf=("Input n:")

int n;

在可执行语句之后定义变量 编译错误
int n=3.5

在定义变量时,用于变量初始化的常量类型与定义的变量

类型不一致

有的编译器

不提示错误

int m=n=0; 在定义变量时,对多个变量进行连续赋初值 编译错误
posted @ 2021-01-23 12:06  油菜园12号  阅读(889)  评论(0编辑  收藏  举报