avatar

zian

A text-focused Halo theme

  • Java
  • 面试
  • 首页
  • C语音
  • liunx
  • 数据结构与算法
  • 控制台
Home C语言核心语法
文章

C语言核心语法

Posted 2024-12-16 Updated 2024-12- 17
By Administrator
232~298 min read

1. 数据类型

sizeof 运算符

目标:会查看变量、类型占用内存大小

每种数据类型,都有自己固定的占用内存大小和取值范围。具体展开讲解前,我们先来看下,C 语言提供的查看变量或类型占用内存大小的运算符,sizeof。

  • 语法 1:sizeof(变量名)

    int a = 10;
    printf("%zu\n", sizeof(a));//sizeof(a) 获取 a 变量占用内存大小。可以用 printf 显示出来
    // 查看 sizeof 返回的占用内存大小,需要使用 %llu 格式符
  • 语法 2:sizeof(类型名)

    printf("%zu\n", sizeof(double)); // 也可以使用 sizeof 直接查看某种类型占用的内存大小

#include <stdio.h>
​
int main() {
​
    // short 类型一般表示 2 个字节
    short a = 10;
    printf("%d \n", a);
    printf("%zu \n", sizeof(short));
    printf("%zu \n", sizeof(a));
​
    // int  类型一般代表 4个字节
    int b = 100; 
    printf("%d \n", b);
    printf("%zu \n", sizeof(int));
    printf("%zu \n", sizeof(b));
​
    // long 类型在 win 中代表 4 字节 ,在linux 32 位中代表 4 个字节 在 64 位 中代表 8 个字节
    long c = 1000l;
    printf("%ld \n", c);
    printf("%zu \n", sizeof(long));
    printf("%zu \n" , sizeof(c));
​
    // long long 在 win 中代表 8 字节,在 c99 中才有该数据类型
    long long d = 10000;
    printf("%lld \n", d);
    printf("%zu \n", sizeof(long long));
    printf("%zu \n", sizeof(d));
    
    return 0;
}

数值型

整型

目标:选用不同类型存整数

基础信息

数据类型

字节数

格式符

数据范围

最小值宏

最大值宏

short(短整型)

2

%hd

-215 ~ 215-1 (-32768 ~ 32767)

SHRT_MIN

SHRT_MAX

int(整型)

4

%d

-231 ~ 231-1 (-2147483648 ~ 2147483647)

INT_MIN

INT_MAX

long(长整型)

4

%ld

-231 ~ 231-1 (-2147483648 ~ 2147483647)

LONG_MIN

LONG_MAX

long long(长长整型)

8

%lld

-263 ~ 263-1

LLONG_MIN

LLONG_MAX

unsigned short(无符号 短整型)

同 short

%hu

0 ~ 216-1 (0 ~ 65535)

0

USHRT_MAX

unsigned int(无符号 整型)

同 int

%u

0 ~ 232-1 (0 ~ 4294967295)

0

UINT_MAX

unsigned long(无符号 长整型)

同 long

%lu

0 ~ 232-1 (0 ~ 4294967295)

0

ULONG_MAX

unsigned long long(无符号 长长整型)

同 long long

%llu

0 ~ 264-1

0

ULLONG_MAX

上表中列出的占用字节数和取值范围,是大多数情况下各种类型的取值。

由于,C 标准没有具体规定以上各类数据所占用的字节数。因此,在不同系统、编译器下,数据类型占用的字节数会有所不同。

比如:int 类型,在 Turbo C 环境占 2 字节,取值范围与 short 相同。 而在 Visual C 环境下是 4 字节。

再如:long 类型,相同的 gcc 编译器下,在 Windows 系统中占 4 字节,而在 Linux 系统中占 8 字节。

可以使用 sizeof 查看 数据类型 占用内存的大小。

可以引入头文件 #include <limits.h> 借助宏来查看 数据类型 在当前平台上 对应的最小、最大值。

#include <stdio.h>
#include <limits.h>
​
int main(void)
{
    printf("short 大小 = %llu\n", sizeof(short));
    printf("short 最小值 = %hd, 最大值 = %hd\n", SHRT_MIN, SHRT_MAX);
    printf("unsigned short 最小值 = 0 最大值 = %hu\n", USHRT_MAX);
    printf("\n");
    
    printf("int 大小 = %llu\n", sizeof(int));
    printf("int 最小值 = %d,最大值 = %d\n", INT_MIN, INT_MAX);
    printf("unsigned int 最小值 = 0, 最大值 = %u\n", UINT_MAX);
    printf("\n");
​
    printf("long 大小 = %llu\n", sizeof(long));
    printf("long 最小值 = %ld, 最大值 = %ld\n", LONG_MIN, LONG_MAX);
    printf("unsigned long 最小值 = 0 最大值 = %lu\n", ULONG_MAX);
    printf("\n");
​
    printf("long long 大小 = %llu\n", sizeof(long long));
    printf("long long 最小值 = %lld, 最大值 = %lld\n", LLONG_MIN, LLONG_MAX);
    printf("unsigned long long 最小值 = 0, 最大值 = %llu\n", ULLONG_MAX);
    printf("\n");
​
    return 0;
}

验收案例

  • 编写程序,选择合适的类型 定义变量 存储:人类年龄、中国人口数量 和 地球年龄(约45.5 亿), 并借助宏 打印 选用的类型对应无符号数 最大值,证明你的选择无误。

bool型

目标:知道 bool 类型两种取值

C语言在设计之初是没有布尔类型的,使用 1 和 0,对应表示真、假。

但,其他编程语言像 C++、java 都设计有布尔数类型。 C语言在1999 年推出的新标准(C99)中,也加入了 布尔类型。用 true 来代表 1,为真;用 false 来代表 0,为假。使用时,需要引入头文件 #include <stdbool.h>

#include <stdbool.h>
​
int main(void)
{
    printf("%d, %d\n", true, false); // 1, 0
    return 0;
}

虽然语法上与其他语言一致,但 C 语言每次在使用时需先引入头文件,较为麻烦。 因此,一些老 C 工程师还是喜欢直接在程序中用 1 和 0 来表示 真和假。

实型

目标:会选用浮点型变量存小数

实型表示有符号的十进制小数,在计算机内部以浮点方式表示(小数点是浮动的),因此也叫浮点型。

常见实型有两种: float (单精度)、 double (双精度)

实型数据没有八、十六进制,也没有 unsigned 无符号形式。在计算机底层采用的是近似计算,实现比较复杂,且不同平台处理方式不同。我们这里只学习它基本的知识。

基础信息

类型

字节数

格式符

有效数字

常量后缀

float (单精度)

4

%f

6~7

f

double (双精度)

8

%lf

15~16

无

我们直接书写的小数常量,如 6.23,系统默认看做 double 类型。如想指明为 float 类型,需加后缀 f,6.23f。

  • 6~7:

    • 整数部分 + 小数部分 <= 6 位, 准确。

    • 整数部分 + 小数部分 == 7 位,可能准确,也可能不准确。

    • 整数部分 + 小数部分 > 7位。大多不准确。

  • 15~16:

    • 整数部分 + 小数部分 <= 15 位, 准确。

    • 整数部分 + 小数部分 == 16 位,可能准确,也可能不准确

    • 整数部分 + 小数部分 > 16位。大多不准确。

显示小数时,%f 和 %lf 默认保留 6 位小数。

如需指定小数位数,使用格式符 %.nf ,n 为几,表示精确到小数点后几位,会对 n+1 位做 4 舍 5 入。

#include <stdio.h>
​
int main(void)
{
    float f = 1.23456789101112131415f; // 定义有 20 位小数的 float 变量
    double d = 1.23456789101112131415; // 定义有 20 位小数的 double 变量
​
    printf("f=%.20f\n", f);
    printf("d=%.20lf\n", d);
​
    return 0;
}

验收案例

  • 已知 圆周率π的值为3.14159265358979323846。选择一种浮点数类型定义变量保存π值,并打印输出变量,要求正确保留小数点后 8 位数据。

字符型

目标:会在程序中使用字符型数据

基础信息

C 语言定义 char 类型来表示字符数据。 其本质依然是存储数值,因此与数值型类似,也有有符号、无符号之分。占用 1 个字节内存大小。

类型

字节数

格式符

数据范围

最小值宏

最大值宏

char

1

%hhd

-27 ~ 27-1 (-128 ~ 127)

CHAR_MIN

CHAR_MAX

unsigned char

1

%hhu

0~28-1 (0 ~ 255)

0

UCHAR_MAX

ASCII 码

char 类型在程序中,最常用来表示字符。其本质依然是一个数字,但每个值都对应一个固定的字符,共定义了128个字符。称之为 ASCII 码 (American Standard Code for Information Interchange) 美国信息交换标准代码。

ASCII值

控制字符

ASCII值

字符

ASCII值

字符

ASCII值

字符

0

NUL

32

(space)

64

@

96

、

1

SOH

33

!

65

A

97

a

2

STX

34

"

66

B

98

b

3

ETX

35

#

67

C

99

c

4

EOT

36

$

68

D

100

d

5

ENQ

37

%

69

E

101

e

6

ACK

38

&

70

F

102

f

7

BEL

39

‘

71

G

103

g

8

BS

40

(

72

H

104

h

9

HT

41

)

73

I

105

i

10

LF

42

*

74

J

106

j

11

VT

43

+

75

K

107

k

12

FF

44

,

76

L

108

l

13

CR

45

-

77

M

109

m

14

SO

46

.

78

N

110

n

15

SI

47

/

79

O

111

o

16

DLE

48

0

80

P

112

p

17

DCI

49

1

81

Q

113

q

18

DC2

50

2

82

R

114

r

19

DC3

51

3

83

S

115

s

20

DC4

52

4

84

T

116

t

21

NAK

53

5

85

U

117

u

22

SYN

54

6

86

V

118

v

23

TB

55

7

87

W

119

w

24

CAN

56

8

88

X

120

x

25

EM

57

9

89

Y

121

y

26

SUB

58

:

90

Z

122

z

27

ESC

59

;

91

[

123

{

28

FS

60

<

92

\

124

|

29

GS

61

=

93

]

125

}

30

RS

62

>

94

^

126

~

31

US

63

?

95

_

127

DEL

上表中有 6 个字符对应的 ASCII 较为常见,建议大家记下,会为后续写代码提供很多方便。

字符

ASCII 码

字符

ASCII 码

空

0

‘\n’

10

空格

32

0

48

A

65

a

97

需注意的是,我们从键盘键入的所有内容都是字符。如,键入数字 7,实际是字符 ‘7’,真正存储在计算机内的是 55(字符 7 的 ASCII 码值),而如果我们键入了 35,实际上这是两个字符。真正存储在计算机内的是 51 和 53(字符 3 和 字符 5 的 ASCII 码值)。

我们可以用 printf 结合 格式符 %c,显示字符。 如果用 %d,就显示 其 ASCII 值了。

#include <stdio.h>
​
int main(void)
{
    char ch = 53;
    printf("ASCII为:%d, 字符为:%c\n", ch, ch);
    return 0;
}

转义字符

C 语言提供了一类特殊的字符,是由 \ 和特定字符组合而成,称之为 转义字符。他们都是 一个 字符,如:

  • ‘\n’ 这是 1 个字符。 代表 回车换行(回车键)。

  • ‘\t’ 也是 1 个字符。代表 制表符 (Tab键)。

  • ‘\b’ 同样是 1 个字符。 代表 退格符(Backspace 键)。

  • ‘\0’ 是一个字符。代表 空。对应 ASCII 值 0。

  • ‘\ddd’ 是一个字符。ddd 对应 3 个八进制数(没有用 0 开头)。 如:\141 对应 ASCII 值为 97,代表 ‘a’。

  • ‘\xhh’ 是一个字符。x 表十六进制,hh 对应 2 个十六进制数。 如:\x41 对应 ASCII 值为 65,代表 ‘A’。

\ 还可以在特定环境下,将一个字符还原其本身意。

比如,现在想在 printf(“%d\n”,10);输出 10 的时候,用 “” 把 10 包裹住。 如果直接写 printf(“ “%d” \n”,10);是会报错的。这时,可以使用 \" 将 “ 进行转义,还原其本身意。

printf("\"%d\"", 10);  // 这里的 \" 看做一个双引号字符。

类似的还有:

  • \' 代表 单引号。

  • \\ 代表 反斜杠。

字符输入输出

C 语言提供了专门的函数,方便在程序中 获取、输出 字符数据。

  • getchar():获取用户从键盘写入的一个字符。

    1. 程序执行到 getchar() 会暂停,等待用户键入字符数据。

    2. 一次 getchar() 调用,只读取一个字符。如用户键入多个字符,需要多次调用 getchar()读取。

    3. 函数调用完成,会返回实际读到的字符 对应的 ASCII 值。

    4. 用户键入字符结束,敲的回车键,对应‘\n’ 字符,也可以使用 getchar() 读取。

    int ret = getchar();
  • putchar(ch):将 ch 对应的字符,输出到屏幕。

    1. ch 可以是变量也可以是常量。

    2. 一次 putchar() 调用,只写出一个字符(不含换行符 ‘\n’)。

    3. 函数调用完成,会返回实际写出的字符 对应的 ASCII 值。

    char ch = 'A';
    int ret = putchar(ch);

验收案例

  • 编写程序,使用 getchar接收用户输入的 字符 a 和回车符。要求通过 ‘a’ 进行数学运算得到 ‘A’,只使用一个 prinf 函数打印 ‘A’ 和 回车符的 ASCII 值,使用 tab 符隔分数据。

数据类型总结:

  1. 整数:short 、int 、 long 、long long

    1. 打印使用的占位符 : %d 、 %ld ( long )、%lld (long long)

    2. long 、long long 定义的变量要在 变量的后面加载 L 或者 LL 例如:long a = 1000L; 【大小写都可以,一般使用大写】

    3. 默认 int 作为整数的类型

  2. 浮点数:float 、 double 、long double

    1. 打印使用的占位符:%f (float ) 、%lf ( double )

    2. float 定义的需要在变量的末尾加上 f 列如:float a = 3.1414f;

    3. double 作为浮点数的默认类型

    4. 浮点数的在打印的时候设置保留的小数点位数 使用 %.要保留的位数f , 例如:printf("%.2f \n" , 2.222) 代表保留两位小数, 默认处理超出的数据方式是 四舍五入

  3. 字符:char

    1. 打印使用的占位: %c

    2. 变量必须是 ASCII 表中的字符

  4. signed 和 unsigned

    1. signed 代表有符号的,意思就是可以正数或者负数

    2. unsigned 代表是无符号的,意思只能是正数 , 变量的取值范围是有符号的最大的范围+最大小的范围

    3. unsigned 只能是整数和字符(会转换为整数)可以使用,浮点数不能使用

  5. 特殊数据类型:

    在 c 语言中字符串数据类型是字符拼接得来的,定义方式

    #include <stdio.h>
    ​
    int main() {
        // 字符串定义方式
        /*
        * char 变量名[内存大小] = 值;
        * 内存值的计算方式是:
        * 字符占用一个字节
        * 汉字占用二个字节
        * 最后有一个隐藏的标记符,占用一个字节
        * 比如 aa好  = 1+1+2+1 = 5 
        * cahr str[5]  = "aa好";
        * 字符创的打印占位符是 %s 
        */
        char str[4] = "aaa";
    ​
        printf("我好大儿的名字 %s", str);
    ​
    ​
        return 0;
    }

    技巧:一般我们不会计算内存大小,给一个比较大的值

2. 标识符

2.1 什么是标识符?

程序中,我们自己起的名字统称为标识符

2.2 标识符的硬性要求

  • 以数字、字母、下划线组成

  • 不能以数字开头

  • 不能是关键字

  • 区分大小写

2.3 标识符的软性建议

用英文单词,见名知意

变量名:全部小写

文件名:全部小写,单词之间用下划线隔开

3. scanf 输入

目标:接收用户输入数据

我们可以借助 getchar() 读取用键入的字符数据。 如果想要读取其他数据怎么办呢?C语言提供了 scanf() 函数,可以结合 格式符 读取各种类型数据。

基础信息

  • 作用:从标准输入设备(键盘)上按格式获取数据。

  • 语法:scanf("格式控制字符串“, ......); 需指定头文件 #include <stdio.h>

    • 参 1: 必须是字符串,且必须包含 格式说明符(占位符)

      • 格式符 与 数据类型中使用方式一致。 常用的有 %d、%c、%f、%lf 等。

    • 后续参数(变参):个数,直接受 参 1 格式匹配符影响。

      • 对应 格式符的 必须是 变量地址(&变量名,可取变量地址),代表数据存放位置。

      • 注意:&代表访问地址值,如果是 string 类型,默认的就是引用的地址,所有不用加上 & ,其他基础数据类型都需要加上 &

  • 示例:

    printf(“请输入一个字符:”); // 借助 printf 提示用户输入
    char ch = 0;    // 准备变量,存储数据
    scanf("%c", &ch);   // 使用变量地址,与 格式符对应
    ​
    printf(“请输入三个整数,用逗号间隔:”);
    int a, b, c;   // 可以不赋初值。
    scanf("%d,%d,%d", &a, &b, &c);

注意事项

  1. 不要在 scanf 的参 1 中,添加类似 printf() 的提示字符串和 \n 换行符。

  2. 键入数据时,数据个数、类型、顺序,必须与参 1 中占位符一一对应。一般写占位符

  3. 键入数据时,数据间的分割符,必须与 参 1 中 占位符的分割符一致。输入的分隔符一般用 空格

  4. scanf 的返回值,代表格式符成功匹配数据的次数。(较少使用)

  5. VS2019 以后的版本编译时,会将 scanf 划为 “不安全函数”,爆出C4996 错误,推荐你使用 s_scanf() 函数。

    但,学习、练习、测试时,直接使用 scanf 很方便,可暂时屏蔽该错误。

    • 方法 1:在项目中设置:工程名→右键→属性→C/C++→预处理器→预处理器定义→编辑→将 CRTSECURE_NO_WARNINGS 加入“预处理定义” 中

    • 方法 2:在每个.c文件开头(第一行)添加宏:#define CRTSECURE_NO_WARNINGS

#include <stdio.h>
​
int main() {
     
    char name[20];
    int age;
​
    printf("请输入名字:");
    scanf("%s", name);
​
    printf("请输入年龄");
    scanf("%d", &age);
​
    printf("名字:%s , 年龄:%d", name, age);
​
​
    return 0;
}


练习

练习:判断一个是否是质数

#include <stdio.h>
#include <math.h>
// 质数(素数)是指大于 1 的自然数,且只能被 1 和它本身整除。
/*
理解 val
   1. 对于一个合数 num,它可以分解为两个因子 a 和 b,即 num = a * b。
   2. 如果 a 和 b 都大于 sqrt(num),那么 a * b 会大于 num,这与 num = a * b 矛盾。
   3. 因此,至少有一个因子 a 或 b 必须小于或等于 sqrt(num)。
*/
void isPrime(int num) {
   if ( num == 1 ) {
      printf("1 不是质数");
   }

   if ( num % 2 == 0 ) {
      printf("%d 不是质数 \n", num);
   }



   double  val = sqrt(num); // 对原来的数进行开根号
   int count = 0;
   for ( int i = 2; i <= val; i++ ) {
      if ( num % i == 0 ) {
         // printf("%d \n", i);
         printf("%d 不是质数 \n", num);
         return;
      }
      count++;
   }
   printf("%d 是质数 \n", num);
   printf("循环了 %d 次 \n", count);
}


int main(int argc, const char* argv[]) {
   isPrime(1231);
   return 0;
}

C语音
License:  CC BY 4.0
Share

Further Reading

Jan 7, 2025

C语言 其他

作用域 关键字 register 在C语言中,register 关键字是一种存储类说明符,用于建议编译器将变量存储在CPU寄存器中,而不是内存中。这样做可以提高访问变量的速度,因为寄存器的访问速度通常比内存快得多。然而,这个关键字只是一个提示,编译器可以选择忽略它。 使用register关键字的变量

Jan 6, 2025

C语言 结构体

结构体 问题的引入 多个相同数据类型的数据可以用数组表示,那么,如果多个不同数据类型的数据如何用一个集合表示呢?? 前面我们所介绍的普通数据类型实际上远远未能满足我们对实际应用中的要求,比如说一个学生,可能包含的属性有年龄、姓名、分数等等,不可能用一个基本数据类型(int 、float 、char)

Dec 28, 2024

C语言 内存

内存 什么是内存 软件在运行是,临时用来存储数据的 操作系统会将内存按照字节划分为 N 多个小格子 什么是内存地址 其实就是格子的编号 32 位操作系统:以 32 位的二进制表示 64 位操作系统:以 64 位的二进制表示 内存地址的作用 快速操作内存中存储的数据 C 语言中如何获取内存地址 &变量

OLDER

若依多表认证

NEWER

c语言 文件操作

Recently Updated

  • 其他
  • Elasticsearch 面试
  • Spring 面试
  • RabbitMQ 面试
  • Redis 面试

Trending Tags

ruoyi docker java

Contents

©2025 zian. Some rights reserved.

Using the Halo theme Chirpy