[Daozy][C 语言入门课程]第2课 基本语法、数据类型

Daozy学院--C 语言入门课程

当前课程对应视频:https://www.daozy.net/college/detail?course_id=2&seq=2

程序基本组成

  1. 预处理器指令
  2. 函数
  3. 变量
  4. 语句和表达式
  5. 注释

实例

#include 
 
int main() {
   /* 我的第一个 C 程序 */
   printf("Hello, World! \n");
   return 0;
}
  1. 程序的第一行 #include 是预处理器指令,告诉 C 编译器在实际编译之前要包含 stdio.h 文件。
  2. 下一行 int main() 是主函数,程序从这里开始执行。
  3. 下一行 /.../ 将会被编译器忽略,这里放置程序的注释内容。它们被称为程序的注释。
  4. 下一行 printf(...) 是 C 中另一个可用的函数,会在屏幕上显示消息 "Hello, World!"。
  5. 下一行 return 0; 终止 main() 函数,并返回值 0。

基本语法

C 程序由各种标记组成,可以是关键字、标识符、常量、字符串,或者是一个符号。下面的 C 语句包括五个标记。

printf("Hello, World! \n");

这五个标记分别是:

printf
(
"Hello, World! \n"
)
;

分号 ;

在 C 程序中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。
例如,下面是两个不同的语句:

printf("Hello, World! \n");
return 0;

注释

注释就像是 C 程序中的帮助文本,它们会被编译器忽略。如下所示:

多行注释
/* 
 * 我的第一个 C 程序 
 * Hello, World
 */
printf("Hello, World! \n");

单行注释
// 我的第一个 C 程序
printf("Hello, World! \n");

标识符

C 标识符是用来标识变量、函数,或任何其他用户自定义类型的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。

C 标识符内不允许出现标点字符和特殊字符,比如 :@、$ 和 %等。C 是区分大小写的编程语言。因此,在 C 中,man 和 Man 是两个不同的标识符。下面列出几个有效的标识符:

mohd zara abc move_name a_123
myname50 _temp j a23b9 retVal

关键字

下表列出了 C 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。

auto    else    long    switch
break   enum    register    typedef
case    extern  return  union
char    float   short   unsigned
const   for signed  void
continue    goto    sizeof  volatile
default if  static  while
do  int struct  _Packed
double

C 中的空格

只包含空格的行,被称为空白行,可能带有注释,C 编译器会完全忽略它。

在 C 中,空格用于描述空白符、制表符、换行符和注释。空格分隔语句的各个部分,让编译器能识别语句中的某个元素(比如 int)在哪里结束,下一个元素在哪里开始。因此,在下面的语句中:

int age;

在这里,int 和 age 之间必须至少有一个空格字符(通常是一个空白符),这样编译器才能够区分它们。另一方面,在下面的语句中:

fruit = apples + oranges;   // 获取水果的总数

fruit 和 =,或者 = 和 apples 之间的空格字符不是必需的,但是为了增强可读性,您可以根据需要适当增加一些空格。

C 数据类型

在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何进行内存分配和对齐。
C 中的类型可分为以下几种:

1   基本类型:
它们是算术类型,包括两种类型:整数类型和浮点类型。
2   枚举类型:
它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。
3   void 类型:
类型说明符 void 表明没有可用的值。
4   派生类型:
它们包括:指针类型、数组类型、结构体类型、共用体类型和函数类型。

数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。

整数类型

下表列出了关于标准整数类型的存储大小和值范围的细节:

类型 存储大小 值范围
char 1 字节 -128 到 127 或 0 到 255
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。

以下列出了32位系统与64位系统的存储大小的差别(windows 相同):


[Daozy][C 语言入门课程]第2课 基本语法、数据类型_第1张图片
enter image description here

为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 sizeof 运算符。表达式 sizeof(type) 得到对象或类型的存储字节大小。下面的实例演示了获取 int 类型的大小:

#include 
 
int main() {
   printf("int 存储大小 : %u \n", sizeof(int));
   return 0;
}

%u 为 32 位无符号整数,当您在 Linux 上编译并执行上面的程序时,它会产生下列结果:

int 存储大小 : 4 

浮点类型

下表列出了64位机器下浮点类型的存储大小、值范围、有效数字,默认保留6位:

类型 存储大小 值范围 有效数字 位分配
float(单精度数) 4 字节 -3.402823E-38 到 3.402823E+38 6位 1位符号位,8位指数位,23位尾数为
double(双精度) 8 字节 -1.797693E-308 到 1.797693E+308 15位 1位符号位,11位指数位,52位尾数位
long double 16 字节 -1.210^-4932~1.210^4932 18位 1位符号位,11位指数位,52位尾数位

有效数:从左边第一个不是0的数字起,到末位数止,这中间所有的数字都叫这个近似数字的有效数字。比如 0.002300,左边第一个非零数字是2,它后面还有3个数字,这4个数8900都是有效数字。

头文件 float.h(/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/float.h)定义了宏,在程序中可以使用这些值和其他有关实数二进制表示的细节。
下面的实例将输出浮点类型占用的存储空间以及它的范围值:

#include 
#include 
 
int main() {
    printf("float 存储最大字节数 : %lu \n", sizeof(float));
    printf("float 最小值: %E\n", FLT_MIN );
    printf("float 最大值: %E\n", FLT_MAX );
    printf("float 精度值: %d\n", FLT_DIG );
    
    printf("double 存储最大字节数 : %lu \n", sizeof(double));
    printf("double 最小值: %E\n", DBL_MIN );
    printf("double 最大值: %E\n", DBL_MAX );
    printf("double 精度值: %d\n", DBL_DIG );
    
    printf("long double 存储最大字节数 : %lu \n", sizeof(long double));
    printf("long double 最小值: %E\n", LDBL_MIN );
    printf("long double 最大值: %E\n", LDBL_MAX );
    printf("long double 精度值: %d\n", LDBL_DIG );
    
    return 0;
}

%E 为以指数形式输出单、双精度实数,当您在 Linux 上编译并执行上面的程序时,它会产生下列结果:

float 存储最大字节数 : 4 
float 最小值: 1.175494E-38
float 最大值: 3.402823E+38
float 精度值: 6
double 存储最大字节数 : 8 
double 最小值: 2.225074E-308
double 最大值: 1.797693E+308
double 精度值: 15
long double 存储最大字节数 : 16 
long double 最小值: 1.797693E+308
long double 最大值: 1.797693E+308
long double 精度值: 18

对于浮点类型数据,通常不能与0直接比较,而是通过其绝对值小于给定的容差值来判断是否满足精度需求。

void 类型

void 类型指定没有可用的值。它通常用于以下三种情况下:

序号 类型 描述
1 函数返回为空 C 中有各种函数可以没有返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status);
2 函数参数为空 C 中有各种函数可以不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void);
3 指针指向 void 类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。

如果现在您还是无法完全理解 void 类型,不用太担心,在后续的章节中我们将会详细讲解这些概念。

实战技能

  1. 常用基本数据类型占用空间(64位机器为例)

char : 1个字节
int :4个字节
float:4个字节
double:8个字节

  1. 基本类型书写

整数
a,默认为10进制 ,10 ,20。
b,以0开头为8进制,045,021。
c.,以0b开头为2进制,0b11101101。
d,以0x开头为16进制,0x21458adf。

小数
单精度常量:2.3f 。
双精度常量:2.3,默认为双精度。

字符型常量
用英文单引号括起来,只保存一个字符'a'、'b' 、'*' ,还有转义字符 '\n' 、'\t'。

字符串常量
用英文的双引号引起来,可以保存多个字符:"abc"。

  1. 数据类型转换
    C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型;在 C 语言中也可以对数据类型进行强制转换;

自动转换规则:
a)浮点数赋给整型,该浮点数小数被舍去;
b)整数赋给浮点型,数值不变,但是被存储到相应的浮点型变量中;

强制类型转换形式: (类型说明符)(表达式)

#include 

int main() {
    float f = 0.0;
    float x = 3.6;
    float y = 5.2;
    int i = 4;
    int a = 0;
    int b = 0;
    
    a = x + y;
    b = (int)(x + y);
    f = 10 / i;
    
    printf("a = %d, b = %d, f = %f, x = %f\n", a, b, f, x);
}

例中先计算 x+y 值为 8.8,然后赋值给 a,因为a为整型,所以只取整数部分8,a=8。
接下来 b 把 x + y 强制转换为整型。
最后 10 / i 是两个整数相除,结果仍为整数 2,把 2 赋给浮点数 f。
x 为浮点型直接输出。

你可能感兴趣的:([Daozy][C 语言入门课程]第2课 基本语法、数据类型)