C语言基础(四)【运算符与表达式】


一、主要的运算符(操作符)和表达式

1.算数操作符

(1). 双目操作符:用于执行两个操作数之间的算术运算。

a. 加法 (+): 将两个数值相加。

int x = 5;
int y = 3;
int sum = x + y;  //结果为 8

b. 减法 (-): 从一个数值中减去另一个数值。

int x = 5;
int y = 3;
int n = x - y;  //结果为 2

c. 乘法 (*): 将两个数值相乘。

int x = 5;
int y = 3;
int n = x * y;  //结果为 15

d. 除法 (/): 将一个数值除以另一个数值。

int x = 10;
int y = 2;
int n = x / y;  //结果为 5

注意:

  1. 除号的两端如果是整数,执行的是整数除法,得到的结果也是整数。
    示例:
int x = 3;
int y = 2;
int m = x / y;
float n = x / y;
printf("%d\n", m);   //输出 1
printf("%f\n", n);   //输出 1.000000

虽然变量 n 的类型是 float (浮点数),但是 3 / 2 得到的结果是 1.0 ,而不是
1.5 。原因就在于 C 语言里面的整数除法是整除,只会返回整数部分,丢弃小数部分。

  1. 如果希望得到浮点数的结果,两个运算数必须至少有一个浮点数,这时 C 语言就会进行浮点数除法。
    示例:
float n = 3 / 2.0;   //也可以把 3 写成 3.0
printf("%f\n", n);   //输出 1.500000

e. 取模 (%): 求两个整数相除的余数且只能用于整数,不能用于浮点数。

int x = 10;
int y = 3;
int n = x % y; 
printf("%d\n",n);   // 结果为 1

注意:负数求模的规则是,结果的正负号由第一个运算数的正负号决定。

示例:

int x = 3 % -2;
int y = -3 % 2;
int z = -3 % -2;
printf("%d\n", x);   //输出 1 
printf("%d\n", y);   //输出 -1
printf("%d\n", z);   //输出 -1

(2). 单目操作符 ++ 与 – :只需要一个操作数就能完成运算,通常位于操作数的前面或后面。

a. 前置++ 与后置++:自增运算符,将操作数的值增加1。

示例1:

int a = 3;
int b = ++a;     //前置++,++的操作数是a,是放在a的前⾯的,就是前置++
printf("a = %d\n", a);    //输出 a = 4
printf("b = %d\n", b);    //输出 b = 4

a 原来是 3,先 +1,后 a 变成了 4,再使用就是赋值给 b,b 得到的也是 4,所以计算结束后,a 和 b 都是4。等价于下面示例2。

示例2:

int a = 3;
a = a + 1;
int b = a;
printf("%d\n", a);
printf("%d\n", b);

示例3:

int a = 3;
int b = a++;     //后置++,++的操作数是a,是放在a的后⾯的,就是后置++
printf("a = %d\n", a);    //输出 a = 4
printf("b = %d\n", b);    //输出 b = 3

a 原来是 3,先使用,就是先赋值给 b,b 得到了 3,然后再 +1,然后 a 变成了 4,所以直接结束后 a 是 4,b 是 3。等价于下面示例4。

示例4:

int a = 3;
int b = a;
a = a + 1;
printf("%d\n", a);
printf("%d\n", b);

b. 前置-- 与后置–:自减运算符,将操作数的值减少1(与前面示例1,2用法一致)。

注意:前置++(如++1),先+1,后使用。后置++(如1++),先使用,后+1。同理,前置–与后置–的用法跟前面一样。


2.赋值操作符

(1). 基本赋值操作符:将右侧表达式的值赋给左侧的变量。

	int a = 2;
	int b = 4;
	int c = 0;
	c = b = a + 3;  
	printf("%d\n", c);   //输出 5
    printf("%d\n", b);   //输出 5

(2). 比较常用的复合赋值操作符:在基本赋值操作符的基础上,结合了算术操作符。这使代码更加简洁,并减少了重复的代码量。以下是C语言中常见的复合赋值操作符:

a. +=:加法赋值操作符。它将左侧变量与右侧表达式的值相加,然后将结果赋回给左侧变量。

b. -=:减法赋值操作符。它将左侧变量的值减去右侧表达式的值,然后将结果赋回给左侧变量。

c. *=:乘法赋值操作符。它将左侧变量与右侧表达式的值相乘,然后将结果赋回给左侧变量。

d. /=:除法赋值操作符。它将左侧变量的值除以右侧表达式的值,然后将结果赋回给左侧变量。注意,如果右侧表达式的值为0,则会导致除以零的错误。

e. %=:取模赋值操作符。它将左侧变量除以右侧表达式的值,并将余数赋回给左侧变量。

示例:

int x = 5;
x += 2;    // 相当于 x = x + 2,结果为 7
x -= 2;    // 相当于 x = x - 2,结果为 6
x *= 4;    // 相当于 x = x * 4,结果为 24
x /= 3;    // 相当于 x = x / 3,结果为 8
x %= 5;    // 相当于 x = x % 5,结果为 3

3.逻辑运算符

在C语言中,逻辑运算符用于根据布尔值(真或假)进行逻辑运算。C语言中有三个主要的逻辑运算符:逻辑与(&&)、逻辑或(||)和逻辑非(!)。

(1). 逻辑与(&&):当且仅当两个操作数都为真(非 0)时,结果才为真(1),否则为假(0)。

示例1:

int a = 2;
int b = 3;
int c = (a > 0) && (b > 0);
printf("c = %d\n", c);    //输出 c = 1

注意:如果第一个操作数为假,则不会计算第二个操作数。


(2). 逻辑或(||):当两个操作数中至少有一个为真(非 0)时,结果为真(1),否则为假(0)。

示例2:

int a = 2;
int b = 0;
int c = (a > 0) || (b > 0);
printf("%d\n", c);   //输出 1

注意:如果第一个操作数为真,则不会计算第二个操作数。


(3). 逻辑非(!):对操作数进行逻辑非操作,将真(非 0)转换为假(0),将假(0)转换为真(1)。

示例3:

int a = 0;
int b = !a;
printf("%d\n", b);    //输出 1

注意:逻辑运算符通常用于条件语句中,如 if、while、for 等(以后会讲的)。
逻辑运算符存在优先级:逻辑非(!)的优先级高于逻辑与(&&)和逻辑或(||)。
逻辑与(&&)的优先级高于逻辑或(||)。所以使用逻辑运算符时,通常需要用括号明确表达式的计算顺序,以避免由于优先级引起的歧义。


4.条件运算符

在C语言中,条件运算符(也称为三元运算符)是一种特殊的运算符,它允许基于条件表达式的结果来选择两个值中的一个。
条件运算符的一般形式如下:条件表达式 ? 表达式 1 : 表达式 2;

condition ? expression1 : expression2;

条件表达式:这是一个返回布尔值(真或假)的表达式。
表达式1:如果条件表达式的结果为真(非零),则计算并返回这个表达式的值。
表达式2:如果条件表达式的结果为假(零),则计算并返回这个表达式的值。

示例1:

int a = 10;
int b = 20;
int c = a > b ? a : b;
printf("%d\n", c);    输出 20

int c = (a > b) ? a : b; // 这里 a 小于 b,所以 c 被赋值为 b。在这个例子中,(a > b) 是条件表达式,它返回假(因为 10 不大于 20),因此 c 被赋值为 b 的值,即20。

注意:确保每个表达式都有返回值,以避免在某些条件下没有值被返回。



5.关系运算符

在C语言中,关系运算符用于比较两个值之间的关系,并返回一个布尔值(真或假)。以下是C语言中的关系运算符:

(1). 等于 (==):检查两个操作数是否相等。

int a = 3;
int b = 3;
if (a == b) 
{
     expression;   // 如果a等于b,执行这里的代码
}

(2). 不等于 (!=):检查两个操作数是否不相等。

int a = 7;
int b = 8;
if (a != b) 
{
     expression;   // 如果a不等于b,执行这里的代码
}

(3). 小于 (<):检查左边的操作数是否小于右边的操作数。

int a = 1;
int b = 9;
if (a < b) 
{
     expression;    // 如果a小于b,执行这里的代码
}

(4). 大于 (>):检查左边的操作数是否大于右边的操作数。

int a = 11;
int b = 2;
if (a > b) {
     expression;    // 如果a大于b,执行这里的代码
}

(5). 小于等于 (<=):检查左边的操作数是否小于或等于右边的操作数。

int a = 7;
int b = 7;
if (a <= b) 
{
      expression;   // 如果a小于或等于b,执行这里的代码
}

(6). 大于等于 (>=):检查左边的操作数是否大于或等于右边的操作数。

int a = 8;
int b = 6;
if (a >= b) 
{
      expression;  // 如果a大于或等于b,执行这里的代码
}

注意:当比较浮点数时,由于浮点数的表示方式可能导致精度问题,直接比较两个浮点数是否相等通常是不安全的。可以设置一个误差阈值:定义一个比较小的正数作为误差阈值,用来确定两个浮点数差的绝对值在这个范围内可以被认为是相等的。


6.强制类型转换

在C语言中,强制类型转换是一种将一个数据类型的值转换为另一个数据类型的值的操作。

基本语法:
(目标类型) 要转换的值;
(type) expression;

示例1:

int a = 3.14;  

a 是 int 类型, 3.14 是 double 类型,两边的类型不⼀致,编译器会报警告。

在这里插入图片描述
示例2:

int a = 3.14;
float b = (float)a;   // 将整数 a 转换为浮点数 b,结果是 3.000000

示例3:

float a = 4.4;
int b = (int)a;     // 将浮点数 a 转换为整数 b,结果将是 4(小数部分被截断)

注意:

  1. 数据丢失:当从一种范围较大的数据类型转换为一种范围较小的数据类型时(例如,从 double 转换为 int ),可能会发生数据丢失或精度下降。

  2. 安全性:指针类型(以后会提到)的转换尤其需要小心,因为不正确的指针类型转换可能会导致未定义的行为或程序崩溃。


二、printf 和scanf 函数的使用

1. printf 函数

在C语言中,printf 函数是一个比较常用的标准库函数,用于将格式化的数据输出到标准输出设备。printf 函数定义在 <stdio.h> 头文件中,因此在使用 printf 之前需要包含这个头文件。

(1). 基本语法:

int printf(const char *format, ...);

format 是一个字符串,它指定了后续参数如何被格式化和输出。
… 表示函数可以接受可变数量的参数。

(2). 返回值(一般不重点要求):
printf 函数返回的值为 int 类型。一般返回成功,则输出字符的数量。如果发生错误,它返回一个负数。

(3). 常见的占位符:
以 % 开头,后面可以跟有特定的格式代码,用于指定输出的类型和格式。

%d 或 %i:输出一个整数(十进制)。
%u:输出一个无符号整数(十进制)。
%ld:输出一个长整数(十进制)。
%f:输出一个浮点数。
%lf:输出一个双精度浮点数。
%e 或 %E:输出一个浮点数(科学计数法)。
%g:输出一个浮点数(根据数值的大小自动选择 %f 或 %e)。
%x 或 %X:输出一个整数(十六进制)。
%o:输出一个整数(八进制)。
%c:输出一个字符。
%s:输出一个字符串。
%p:输出一个指针(地址)的值。
宽度(如%6d):指定输出的最小宽度。如果数值宽度小于指定宽度,则默认用空格填充。
精度(如%.2f):指定浮点数的小数点后位数。

示例1:

#include <stdio.h>
    int main() 
    {
        int num = 9;
        float pi = 3.14159;
        char ch = 'A';
        char str[] = "Hello World!";

        printf("整数: %d\n", num);
        printf("浮点数: %.2f\n", pi);
        printf("字符: %c\n", ch);
        printf("字符串: %s\n", str);
        printf("十六进制: %x\n", num);
        printf("八进制: %o\n", num);
        printf("指针(地址): %p\n", &num);
        return 0;
    }

输出结果:
在这里插入图片描述

在这个示例中,我们使用了 printf 函数来输出不同类型的数据。通过格式字符串,我们可以控制输出的格式,例如浮点数保留两位小数,或者整数以十六进制或八进制的形式输出。

使用占位符时,这个位置可以用其他值代入。

示例2:

printf("%s will eat %d apples", "zhangsan", 3); 
//输出 zhangsan will eat 3 apples

%s 表示代入的是一个字符串,所以 printf() 的第二个参数就必须是字符 zhangsan 。里面的 %d 就是占位符,表示这里代的值必须是一个整数,也要用其他值来替换。“zhangsan” 替换了 %s 占位符,而数字 3 替换了 %d 占位符。


2. scanf 函数

scanf 函数也是一个比较常用的标准库函数,用于从标准输入设备读取格式化的输入数据。scanf 函数定义在 <stdio.h> 头文件中。因此在使用 printf 之前也要包含这个头文件。

基本语法:

int scanf(const char *format, ...);

format 是一个格式字符串,它指定了后续参数如何被解析和存储。
… 表示函数可以接受可变数量的参数。

返回值:
如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量 EOF。

常用的占位符跟前面 printf 函数的占位符基本一致。

示例1:

int num;
float pi;
char name[50];

scanf("%s", name);  // 读取字符串
scanf("%d", &num);  // 读取整数
scanf("%f", &pi);  // 读取浮点数

这个例子使用了 scanf 函数来读取不同类型的数据。用户输入的数据将被存储在相应的变量中。

注意:

  1. %c 不忽略空白字符,总是返回当前第⼀个字符,无论该字符是否为空格。
  2. scanf() 将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时,很可能会超过数组的边界,导致预想不到的结果。为了防止这种情况,使用 %s 占位符时,应该指定读入字符串的最长长度,即写成 %[m]s ,其中的 [m] 是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。

示例2:

char name[11];
scanf("%10s", &name);

name 是一个长度度为11的字符数组, scanf() 的占位符 %10s 表示最多读取用户输入的 10 个字符,后面的字符将被丢弃,这样就不会有数组溢出的风险了。


总结

本文介绍了算术运算符:加法,减法 ,乘法,除法 ,取模等。 赋值运算符,逻辑运算符的特点, 条件运算符(即三元运算符)的使用方法( 根据条件表达式的结果选择两个值中的一个)。一些基本的关系运算符,强制类型转换,还有 printf 和 scanf 函数的使用等。

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱学习的汤姆486

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

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

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

打赏作者

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

抵扣说明:

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

余额充值