C语言大师之路:从零到王者/新手入门(2)变量与运算符

序(一些闲话)

  1. 我希望我的语言不要像专业书那样让人眼花缭乱,所以当我解释语法时,我会尽量避免使用太多专业术语,让说明更容易理解。我会用通俗易懂的语言来解释,而不是像专业书籍那样让人感到困惑。
  2. 本人计划通过文章分享C语言的核心知识点和学习心得。鉴于仍处于学习阶段,文章中可能包含错误或片面观点,因此诚挚欢迎读者的指正。期望与读者共同学习、进步,最终成为入门C语言。
  3. 这个系列文章旨在简要介绍每个C语言知识点,希望读者(也包括自己)能对C语言有一个基本的了解。所以每一步尽量非常详尽 .
    c语言教程

一、第一个程序 Hello, world!

#include <stdio.h> 是一个预处理命令,它告诉编译器在编译时要包含标准输入输出库。
函数是用来执行特定任务的一段代码,可以重复使用。main 函数是程序的入口点,其中包含了打印 “Hello, world!” 这一操作。


#include <stdio.h> //头文件使我们可以使用C语言库本身就已经提供给我们的函数
int main(){//main函数是程序的入口
//一个工程中main函数有且仅有一个
    printf("Hello, world!\n");//printf()是输出函数,'\n'是换行的意思
	return 0;
}

1. 其中主函数main是程序的唯一入口点。它的类型为int,表明它将返回一个整数作为程序的退出状态码。main一个工程中有且只可以有一个
2. printf()是一个用于格式化输出的函数,它的功能是在屏幕上输出指定的信息。
3. \n是转义字符中的换行符,用于在输出中创建换行。需要注意的是C程序必须从主函数开始执行。
4. return语句用来指定函数的返回值,具体返回值的类型根据函数类型而定。


C语言良好代码要求:
每个语句/声明占据一行
包含头文件时需要单独一行
可执行语句结束时需使用分号
函数体内的语句需要缩进,一般使用Tab键为一个缩进
括号需要成对出现,删除时也需要成对删除
C语言代码规范


二、C语言数据类型


C 语言中的数据类型主要分为以下几类:

一、基本数据类型:

  1. 整型:包括 int、short、long 等
  2. 浮点型:包括 float、double 等
  3. 字符型:char

二、构造数据类型:

  1. 数组:由相同类型的元素组成的数据集合
  2. 结构体:由不同类型的元素组成的数据集合
  3. 枚举:由一组命名的整型常量组成

三、指针数据类型:

  • 用于存储变量的地址

四、空类型:

  • 用于表示空或无效值的数据类型,用关键字 void 表示

数据类型


我们可以使用sizeof运算符来查看每种类型的大小

#include <stdio.h>
int main() {
   printf("Size of char : %d byte\n", sizeof(char));
   printf("Size of int : %d bytes\n", sizeof(int));
   printf("Size of float : %d bytes\n", sizeof(float));
   printf("Size of double : %d bytes\n", sizeof(double));
   return 0;
}

  • 这里是输出结果:
    输出结果

由上图我们可以看出:

  • char占一个字节
  • int 占四个字节
  • float 占四个字节
  • double 占八个字节
数据类型 大小
char 1 字节
int 2 字节
float 4 字节
double 8 字节

下面我们来看一下整形数据里所占用字节以及取值范围

数据类型 字节 取值范围
int 2字节 -32768~32767
short int 2 字节 -32768~32767
long int 4 字节 -2147483648 ~2147483647
unsigned int 2 字节 0~65535
unsigned short int 2 字节 0~65535
unsigned long int 4 字节 0~4294967295

编者注

  • 还有一个类型是布尔类型
    1.布尔类型只有两个取值True(真),False(假)
    其中如果为True(真)就输出1
    其中如果为False(假)就输出0

  • 在 C 语言中,short int 和 long int 的取值范围至少符合上述表格中的规定,但是 int 的取值范围受编译环境的影响,可能会有所不同。具体来说,int 的取值范围取决于所占的字节数,而不同的编译器可能会根据其规定选择不同的大小。

  • 根据 ANSI 标准,int 应为 2 个字节,这也是 Turbo C 所遵循的规范,因此在 Turbo C 中,int 确实占据 2 个字节。然而,在 Visual C++ (VC) 中,一个 int 占据 4 个字节。

  • 因此,在实际应用中,为确保代码的可移植性,特别是涉及到整型数据类型的大小和取值范围时,我们要格外小心,并充分了解目标编译环境对数据类型大小和取值范围的规定。

  • 在C语言中,字符串没有一个单独的数据类型来表示,而是以字符数组的形式存在。因此,我们使用字符数组来存储和操作字符串数据。 C语言的字符串本质上是以空字符(‘\0’)结尾的字符数组。


我们再来看一下基本数据类型中的浮点型数据


浮点型即是带小数的数字

浮点型数据类型的存在是为了能够更精确地表示实数(即小数)值。在计算机科学和工程中,许多现实世界的量和测量结果都是小数,例如物理学中的测量数据、金融中的货币数值,以及工程设计中的精确计算等。

由于对于小数值精度和范围的需求不同,浮点型数据类型被分为三种:

  1. float
  2. double
  3. long double

我们接着使用sizeof运算符来查看每种类型的大小

#include <stdio.h>
int main() {
   printf("Size of float : %d bytes\n", sizeof(float));
   printf("Size of double : %d bytes\n", sizeof(double));
   printf("Size of long double : %d bytes\n", sizeof(long double));
   return 0;
}
  • 这里是输出结果:
    输出结果
数据类型 字节
float 4字节
double 8字节
long double 16字节

三、变量与常量

C语言中,变量是用来存储和处理数据的标识符,它可以在程序执行过程中改变其值。常量是一个固定的值,在程序执行时不会改变。
变量就好像一个储存盒子,可以装入不同的东西,变的值用变量来表示
常量就像是一个固定的数值或者一个固定的东西,不会变化

  • 例如
 int  a = 10;
 float b = 3.14;

在这段代码中:
a 是一个变量 而 10 为常量
b 是一个变量 而 3.14 为常量

这里就要注意了:
变量必须先定义 后使用


那么变量如何定义呢? 这里就需要用到赋值符号"="
结构是 变量 = 表达式

  • 例如
 int  a = 10;
 float b = 3.14;

变量的分类
变量分为局部变量与全局变量

四、输入输出语句

printf输出函数

printf函数将所有参数按字符类型输出,返回类型为(int)


  • 一个程序必须有一个或多个输出
    但输入可以有零个或多个。

输出格式为:printf("输出格式符",输出项);

让我们以更通俗的方式来解析printf()函数每个参数的作用

功能描述 示例代码 注释
使用printf打印整数 printf("输出的钱是:%d\n", money); %d是一个占位符,用于插入一个整数。这里money是一个整数变量。
解释%d %d %dprintf函数中用于表示整数的转换说明。

在这里插入图片描述
对于上图格式的理解

  1. 首先,让我们用双引号格式字符串括起来
  2. 字面字符:简单来说的话 就是你写什么 计算机就打印什么
  3. 转换说明:是一种指示计算机在特定位置上会放置何种类型数据的指示。
    比如,"%d"表示接下来的数据是一个整数
    计算机在遇到特定的转换说明时,会根据其约定的类型进行数据的处理

转换说明 注解
%d 带符号的十进制整数(即int型)
%c 单词字符(即char型)
%f 输出6位小数(即float型)

小补充
%.xf 表示输出的float类型(其中x为想要保留的位数)如不写则默认为6位小数
格式符的个数要与变量、常量或者表达式的个数一一对应

#include <stdio.h>
int main() {
   int  a = 10;
   float b = 3.14;
   char c = 'A';
   printf("输出的int为: %d\n", a);
   printf("输出的float为: %.3f\n", b); //%.xf 表示输出的float类型
   //我这里是%.3f 所以输出会保留三位小数
   printf("输出的char为: %c\n", c);
   return 0;
}

  • 这里是输出结果:
    输出类型
    这里只需要简单地修改 printf 函数中的格式说明符就可以改变输出小数的精度
    默认为保留六位
    读者可以自己试一下

scanf输入函数解析

scanf函数返回(int),该值表示成功按照指定格式正确输入的变量个数。

输出格式为:scanf("输入格式符",输入地址1,输入地址2,....);


让我们以更通俗的方式来解析scanf()函数每个参数的作用

功能描述 示例代码 注释
输入整数 scanf(“%d”, &num); %d是一个占位符,用于接受一个整数输入。这里num是一个整数变量。
解释%d %d %d是scanf函数中用于表示整数的转换说明。
解释&num &num &num 表示获取变量 num 的地址。

在这里插入图片描述

对于上图格式的理解

  1. 首先,让我们用双引号格式字符串括起来
  2. 字面字符:简单来说的话 就是你输入什么 计算机就显示什么
  3. 转换说明:是一种指示计算机在特定位置上会放置何种类型数据的指示。
    比如,"%d"表示接下来的数据是一个整数
    计算机在遇到特定的转换说明时,会根据其约定的类型进行数据的处理
  4. 取地址符:从键盘向计算机输入数据时,需要知道自己的数据存放地址所以取地址符用于获取变量的内存地址。取地址符由一个英文字符“&”表示。它可以放置在变量名之前,以获取该变量的地址。

#include <stdio.h>
int main() {
   int a;// 定义一个整数变量a
   float b;// 定义一个浮点数变量b
   char c;// 定义一个字符变量c
   printf("请输入一个整数: "); // 屏幕提示用户输入一个整数
   scanf("%d", &a);
   printf("请输入一个浮点数: ");// 提示用户输入一个浮点数
   scanf("%f", &b);
   printf("请输入一个字符: ");// 提示用户输入一个字符
   scanf(" %c", &c);
   //输出 自己输入的数字
   printf("输入的整数为: %d\n", a);
   printf("输入的浮点数为: %.3f\n", b);
   printf("输入的字符为: %c\n", c);
   return 0;
}

  • 这里是输出结果:
    在这里插入图片描述
  • 这里我们简单修改了一下上面printf的代码
    使得计算机可以提示我们输入 整数、浮点数、字符。
    并且也输出了整数、浮点数、字符。
    读者可以自己一试

五、运算符、表达式、语句

1.算数运算符

以下是C语言中常用的算数运算符:

运算符名称 运算符号 示例代码
加法运算符 + 4+2=6
减法运算符 - 4-2=2
乘法运算符 * 4*2=8
除法运算符 / 4/2=2
取余运算符(模运算符) % 4%2=2
自增运算符 ++ int a = 1;a++
自减运算符 - - int a = 1;a- -

C语言中没有乘方这个运算符,也不能用×, ÷等算术符号。


  • 读者可以自行尝试运行以下代码,以加深对于运算符的理解:
#include <stdio.h>
int main() {
    int a = 5, b = 3, answer;
    // 算术运算符示例
    answer = a + b; // 加法
    printf("a + b = %d\n", answer);
    answer = a - b; // 减法
    printf("a - b = %d\n", answer);
    answer = a * b; // 乘法
    printf("a * b = %d\n", answer);
    answer = a / b; // 除法
    printf("a / b = %d\n", answer);
    answer = a % b; // 求余
    printf("a %% b = %d\n", answer); 
    // %%表示这里就是一个%符,这里需要注意一下,不然会报错。
    
    // 自增/自减运算符示例
    int x = 5;
    x++; // 自增
    printf("x 自增为: %d\n", x);
    int y = 8;
    y--; // 自减
    printf("y 自减为: %d\n", y);
    return 0;
}

  • 这里是输出结果:
    上面代码运行结果

除法运算就要注意了:
如果被除数和除数都是整数,则它们相除的结果也是整数,小数部分将会被省略。例如,8除以3等于2。
但是,如果被除数或除数中有一个是小数,那么它们相除的结果将是一个小数.举例来说,9.0除以2等于4.500000


这里着重强调一下:i++ 与 ++i的区别 非常重要!
如果看不懂区别的话可以先跳过,后面渐渐就可以理解了(或者多看几遍这里)

这两种方式引用顺序不同:

  • i++是先引用,后增加;(先使用X后改变值)
  • ++i是先增加,后引用;(先改变值再引用)

两个示例代码 分别为i++, ++i。

#include <stdio.h>
int main() {
   int i = 1,x;
   x = i++;//X被赋值为i的当前值,然后i再递增
   printf("i = %d, x = %d\n", i, x);
    return 0;
}
  • 这里是输出结果:
    输出结果
    这里可以看出 我们首先把 i 为1 赋值给了x 然后再进行自增运算
    所以这里 i 为2 x为1.因为i=1时是先赋值给了x 再运算。

#include <stdio.h>
int main() {
   int i = 1,x;
   x = ++i;//x被赋值为递增后的i的值
   printf("i = %d, x = %d\n", i, x);
    return 0;
}

这里因为我们先将 i 增加了 1 然后再赋值给X。
所以这里 i 为2.x也为2.

  • 这里是输出结果:
    ++i

2.关系运算符

以下是C语言中常用的关系运算符:

运算符号 说明 示例代码 结果
> (大于) 若X大于y返回真(1)否则为(0) 50 > 5 1
> = (大于等于) 若X大于y返回真(1)否则为(0) 50 > = 50 1
< (小于) 若X大于y返回真(1)否则为(0) 50 < 5 0
< = (小于等于) 若X大于y返回真(1)否则为(0) 50 < = 5 0
== (等于) 若X等于y返回真(1)否则为(0) 50 = = 5 0
!= (不等于) 若X不等于y返回真(1)否则为(0) 50 != 5 1

在这里需要注意以下事项:
在C程序中,关系表达式的结果通常用整数1表示为真,用整数0表示为假。
在使用关系运算符>=、<=、==、!=时,这些符号之间不能有空格,否则会产生编译错误。


3.逻辑运算符

以下是C语言中常用的关系运算符:

运算符号 说明 示例代码 结果
&&(与) 当两边表达式都为真才是真(1),否则为假(0) 10&&1 0
||(或) 当两边表达式都为假才是假(0),否则为真(1) 10||1 1
!(非) 若X大于y返回真(1),否则为(0) !0 1

这里需要解释的是

  1. 逻辑与(&&)运算,两侧都需要表达式。当两边表达式都为真才是真(1),否则为假(0)
  2. 逻辑或(||)运算,两侧都需要表达式。当两边表达式都为假才是假(0),否则为真(1)
  3. 逻辑非(!)运算,是一种对逻辑值进行取反的运算。
    当参与运算的逻辑表达式为真时,逻辑非运算的结果为假;
    当参与运算的逻辑表达式为假时,逻辑非运算的结果为真。

    举例来说,对于表达式 !(5>8),因为5不大于8,所以逻辑非运算的结果为真。

4.三目运算符

C语言中的三目运算符,也称为条件运算符,由?和:组成。它的一般形式如下:
表达式1 ? 表达式2 : 表达式3
其执行逻辑为:
如果 表达式1的值为真,则整个表达式的值为表达式2的值;如果表达式1的值为假,则整个表达式的值为表达式3的值。

#include <stdio.h>
int main() {
    int x = 5;
    int y;
    // 使用三目运算符设置变量y的值
    y = (x > 0) ? 10 : 20;
    // 输出y的值
    printf("y: %d\n", y);
    return 0;
}
  • 这里是输出结果:
    在这里插入图片描述

在这个示例中,
当变量x的值大于0时,将变量y的值设为10;否则将变量y的值设为20。


5.其他运算符

以下是C语言中的其他运算符:

运算符号 解释 示例代码 展开
+ = 加法赋值的省略写法 x + = 10 x=x+10
- = 减法赋值的省略写法 x - = 10 x=x-10
* = 乘法赋值的省略写法 x * = 10 x=x*10
/ = 除法赋值的省略写法 x / = 10 x=x/10
% = 取余的省略写法 x %=10 x=x%10

6.各个运算符之间的优先级

  • C语言运算符优先级
优先级 运算符 名称或含义 解释说明
1 [ ] 数组下标 数组名[常量表达式]
( ) 圆括号 表达式
. 成员选择(对象) 对象 . 成员名
-> 成员选择(指针) 对象指针 -> 成员名
2 - 负号运算符 - 表达式
~ 按位取反运算符 ~ 表达式
++ 自增运算符 ++ 变量名 / 变量名 ++
-- 自减运算符 - - 变量名 / 变量名 - -
* 取值运算符 * 指针变量
& 取地址运算符 & 变量名
! 逻辑非运算符 ! 表达式
sizeof 长度运算符 sizeof(表达式)
3 / 表达式 / 表达式
* 表达式 * 表达式
% 余数 整型表达式 % 整型表达式
4 + 表达式 + 表达式
- 余数 整型表达式 % 整型表达式
5 > 大于 表达式 > 表达式
> = 大于等于 整型表达式 > = 整型表达式
< 小于等于 整型表达式 < 整型表达式
< = 小于等于 整型表达式 < = 整型表达式
6 = = 等于 表达式 = = 表达式
! = 不等于 整型表达式 ! = 整型表达式
7 & & 逻辑与 表达式 & & 表达式
8 | | 逻辑或 表达式 | | 表达式
9 ? : 条件运算符 表达式1?表达式2: 表达式3
10 , 逗号运算符 表达式,表达式,
  1. 括号()、方括号[]、箭头->、点.的优先级最高,它们用于限定表达式的计算次序。
  2. 单目运算符的优先级次之,例如正负号、递增递减等。
  3. 算术运算符的优先级紧随其后,按照常见的数学规则,乘除法优先于加减法。
  4. 关系运算符在算术运算符后,用于比较两个值的大小。
  5. 逻辑运算符优先级较低,但高于条件运算符和赋值运算符。
  6. 赋值运算符的优先级高于逗号运算符,逗号运算符是最低优先级的运算符。
  • 简单来说的话就是:初级运算符( )、[ ]、->、. 高于 单目运算符 高于 算数运算符(先乘除后加减) 高于 关系运算符 高于 逻辑运算符(不包括!) 高于 条件运算符 高于 赋值运算符 高于 逗号运算符

意气风发,漫卷疏狂
学习是成长的阶梯,每一次的积累都将成为未来的助力。我希望通过持续的学习,不断汲取新知识,来改变自己的命运,并将成长的过程记录在我的博客中。

如果我的博客能给您带来启发,如果您喜欢我的博客内容,请不吝“点赞”、“评论”和“收藏”,也欢迎您关注我的博客。
您的支持是我前行的动力。听说点赞会给运气加分,希望您每一天都能充满活力!

愿您每一天都快乐,也欢迎您常来我的博客。我叫意疏,希望我们一起成长,共同进步。
logo
我是意疏 下次见!

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 23:52:01       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 23:52:01       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 23:52:01       4 阅读
  4. Python语言-面向对象

    2024-07-10 23:52:01       8 阅读

热门阅读

  1. openssl error:0A000126:SSL routines:ssl3_read_n:unexpected eof

    2024-07-10 23:52:01       12 阅读
  2. 各种软件启动方式

    2024-07-10 23:52:01       10 阅读
  3. 【创作纪念日】我的三周年创作纪念日

    2024-07-10 23:52:01       11 阅读
  4. Github 2024-07-07 开源项目日报 Top10

    2024-07-10 23:52:01       12 阅读
  5. 部署LVS-DR群集

    2024-07-10 23:52:01       8 阅读
  6. python的列表推导式

    2024-07-10 23:52:01       12 阅读
  7. pip常用命令详解

    2024-07-10 23:52:01       8 阅读
  8. 相机、镜头基础知识及硬件选型介绍

    2024-07-10 23:52:01       8 阅读