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

椟夜学院–C 语言入门课程

官方网站:https://www.duyeyun.top/college

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

程序基本组成

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

实例

#include <stdio.h>

int main() {
   /* 我的第一个 C 程序 */
   printf("Hello, World! \n");
   return 0;
}
  1. 程序的第一行 #include

基本语法

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   派生类型:
它们包括:指针类型、数组类型、结构体类型、共用体类型和函数类型。

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

整数类型

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

类型存储大小值范围
char1 字节-128 到 127 或 0 到 255
unsigned char1 字节0 到 255
signed char1 字节-128 到 127
int2 或 4 字节-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int2 或 4 字节0 到 65,535 或 0 到 4,294,967,295
short2 字节-32,768 到 32,767
unsigned short2 字节0 到 65,535
long4 字节-2,147,483,648 到 2,147,483,647
unsigned long4 字节0 到 4,294,967,295

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

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

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

#include <stdio.h>

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

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

int 存储大小 : 4 
浮点类型

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

类型存储大小值范围有效数字位分配
float(单精度数)4 字节-3.402823E-38 到 3.402823E+386位1位符号位,8位指数位,23位尾数为
double(双精度)8 字节-1.797693E-308 到 1.797693E+30815位1位符号位,11位指数位,52位尾数位
long double16 字节-1.2*10^-4932~1.2*10^493218位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 <stdio.h>
#include <float.h>

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个字节

  2. 基本类型书写

    整数
    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 <stdio.h>

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社区公众号

进入社区贡献者微信群,有机会获取平台代币:
Daozy社区贡献者群

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道知极限编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值