C语言进阶之路-运算符小怪篇

目录

一、学习目标

二、运算符详谈

算术运算符

关系运算符

逻辑运算符

位运算符

特殊运算符

条件运算符

sizeof 运算符

打怪实战

三、控制流

二路分支

多路分支

const

while与 do…while循环

语法:

for循环

break与continue

goto语句(不建议使用)

总结


一、学习目标

  • 各种运算符的操作
  • 控制流的各种应用
  • 结合运算符和控制流编写小程序

二、运算符详谈

算术运算符

运算符

功能说明

举例

  • 加法 +
  • 一目取正 a+b

+a / a+b

  • 减法 -

一目取负

-a / a-b

  • 乘法 *

双目运算符 用于相乘

  • a*b
  • 除法 /

双目运算符 用于相除

a/ b 5/3 = 1 5.0/3 = 1.5

  • 取模(求余) %

双目运算符 用于求余计算

a%b 5%3 = 2

  • ++ 自加1

单目运算符 用于对某一个值进行+1运算

++a (先运算然后返回的是a的地址)

a++ (先返回的是a的值[常量],然后再运算)

  • – 自减1

单目运算符 用于对某一个值进行-1运算

--a (先运算然后返回的是a的地址)

a-- (先返回的是a的值[常量],然后再运算)

  • 关注点:
    • 减号也是负号,比如 -a 是取变量 a 的相反数。
    • 取模运算要求左右两边操作数必须是整型数据。
    • 自加和自减运算不仅可以对整型操作,也可以对浮点数、指针操作。
      • 前缀自加自减运算:先进行自加自减,再参与表达式运算,返回的是一个地址
      • 后缀自加自减运算:先参与表达式运算,在进行自加自减,返回的是一个常量
int a = 100; int b = 200; int c = ++a;
 // a先自加1,变成101;然后再赋值给c,因此c等于101 
int d = b++; 
// b先赋值给d,因此d等于200;然后b自加1,变成201

关系运算符

运算符

功能

举例

说明

>

用于判断关系是否大于

a > b

用于判断关系是否小于

a < b

>=

用于判断关系是否大于或等于

a >= b

用于判断关系是否小于或等于

a

==

用于判断两个关系是否等于

a+43 == 98-b

!=

用于判断两个关系是否不等于

a!=b

  • 关注点:
    • 关系运算符用于判断运算符两边的表达式是否满足给定的大小条件。
    • 由关系运算符组成的表达式称为关系表达式,其值为布尔型。
    • 判断是否相等是双等号==,而不是一个等号。

逻辑运算符

运算符

功能说明

举例

!

逻辑反

!(x==0)

&&

逻辑与

x>0 && x

||

逻辑或

y100

  • 运算规则:
    • 逻辑反:将逻辑真、假翻转,即真变假,假变真。
    • 逻辑与:将两个关系表达式串联起来,当且仅当左右两个表达式都为真时,结果为真。
    • 逻辑或:将两个关系表达式并联起来,当且仅当左右两个表达式都为假时,结果为假。

  • 特殊规则:
    • 在逻辑与运算中,如果左边表达式的值为假,那么右边表达式将不被执行。

    • 在逻辑或运算中,如果左边表达式的值为真,那么右边表达式将不被执行。

位运算符

运算符

名称

举例

功能说明

~

位逻辑反

~a

将变量 a 中的每一位取反

&

位逻辑与

a & b

将变量 a 和 b 逐位进行与操作

|

位逻辑或

a | b

将变量 a 和 b 逐位进行或操作

^

位逻辑异或

a ^ b

将变量 a 和 b 逐位进行异或操作

左移

a

将变量 a 中的每一位向左移动4位

>>

右移

x >> n

将变量 x 中的每一位向右移动4位

  • 位运算符操作的对象是数据中的每一位
  • 运算规则:
    • 位逻辑反、位逻辑与、位逻辑或拥有与逻辑运算相似的规则和一样的真值表
      • 位逻辑反 ~: (单目运算符)把变量中的每一个二进制位进行取反操作
      • 位逻辑与 &: (双目运算符) a&b 则是把a与b的所有二进制进行对应的位与操作
            • 位与操作 有0得0
      • 位逻辑或 | : (双目运算符) a|b 则是把a与b的所有二进制进行对应的位或操作
            • 位或操作 有1得1

    • 异或运算 ^ : (双目运算符) a^b 则是把a与b的所有二进制进行对应的位异或操作
      • 相同为0,不同为1

    • 移位运算:移出去的不要,空出来的补零。移位运算都是针对无符号数的运算。
      • 右移操作: 移出去的丢弃,空出来补符号位
      • 左移操作:移出去的丢弃,空出来补0 , (负数)符号位不变,正数则覆盖符号位

特殊运算符

  • 赋值运算符 =
    • 不能对常量赋值,只能对变量赋值 123 = a ;
    • 不能对数组赋值 , arr = 123 ;
    • 可以连续赋值,顺序从右到左 a = b = c = k = 123 ;
int a, b;
int x[5];

a = 100; // 对变量 a 赋值,正确
3 = 100; // 对常量 3 赋值,错误!
x = 123; // 对数组 b 赋值,错误!

// 连续赋值
a = b = 50; // 先将 50 赋给 b,再将 b 的值赋给 a,正确
  • 复合赋值符
    • 当左右两边有相同的操作数时,采用复合赋值符不仅直观,且能提高运算效率
    • 除了下述10个复合运算符之外,生造别的复合运算符是非法的
// 加减乘除:
a += n; // 等价于 a = a+n;   a = n + a [不太型]
a -= n; // 等价于 a = a-n;   a = n - a  [完全不行]
a *= n; // 等价于 a = a*n;    【不太行】
a /= n; // 等价于 a = a/n;   【完全不行】

// 求余:
a %= n; // 等价于 a = a%n;

// 位运算:
a &= n; // 等价于 a = a&n;
a |= n; // 等价于 a = a|n;
a ^= n; // 等价于 a = a^n;
a >>= n; // 等价于 a = a>>n;
a <<= n; // 等价于 a = a<<n;

条件运算符

  • 唯一需要三个操作数的运算符(三目运算符)
  • 语法:表达式1 ? 表达式2 : 表达式3
  • 释义:当表达式1为真时,取表达式2,否则取表达式3
    • 如果表达式1为真则取冒号左边,否则去冒号右边
  • 举例:
int a = 100;
int b = 200;
int m = (a>b) ? a : b;  // 如果 a>b 为真,则 m 取 a 的值,否则取 b 的值

sizeof 运算符

  • 含义:计算指定数据类型或者变量所占据内存的字节数
  • 语法:sizeof(类型) 、sizeof(变量) ,计算变量的字节数时圆括号可以省略
  • 举例:
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long double));

int a[5];
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);

return运算符

  • 含义:退出某个函数(如果退出的是主函数main,那么整个程序也就退出了)
  • 语法:必须出现在函数体内,可以带函数对应类型的数据
  • 举例:
float func() 
{
     return 1.34; 
}

优先级与结合性

  • 当表达式中出现不同的运算符时,根据优先级来决定谁先执行,比如先乘除,后加减
  • 当表达式中出现多个相同优先级的运算符时,根据结合性来决定谁先运行,比如从左到右

打怪实战

  • 编写一个程序,计算N升纯净水所包含的分子个数,结果用科学计数法表示。
  • 编写一个程序,用户输入华氏温度F,程序输出摄氏温度C,结果保留2位小数。

        提示:华氏温度F转化为摄氏温度C的公式为: C = 5×(F - 32)÷ 9

  • 编写一个程序,将用户输入的天数转化为等价的星期数和天数。

        输入:18输出:2星期零4天

  • 分析并解释以下程序的执行结果。
#include <stdio.h>
int main(void)
{
    int x = 10;
    int a, b, c;
    a = x++;
    b = ++x;
    c = 10*x++;
    printf(“x=%d,a=%d,b=%d,c=%d\n”, x, a, b, c);   
    return 0;
}
  • 【简答题】 简述 ‘a’ 与 “a” 的异同。
  • 【简答题】有时候需要使用 int32_t 类型变量代替 int 类型变量的原因是什么?

三、控制流

二路分支

  • 逻辑:程序中某段代码需要在满足某个条件时才能运行
  • 形式:
    •         if 语句:表达一种 如果-则 的条件执行关系
    •         if-else 语句:表达一种 如果-否则 的互斥分支关系

语法:

if ( 布尔表达式 )
{
    // 如果布尔表达式为真则执行{} 中的代码
}

if( 布尔表达式 )
{
    // 如果布尔表达式为真 则执行 代码块 A
}
else 
{ 
    // 否则执行 代码块 B
}
  • 举例:
// if 语句   int a = 124 ;
if(a%2 == 0)
{
    printf("a是偶数\n");
}
//if-else 语句
if(a%2 == 0)
{
    printf("a是偶数\n");
}
else
{
    printf("a是奇数\n");
}

注意:

  1. if 语句可以单独使用,else 语句不可以,else 语句必须跟if语句配套使用
  2. 不管是 if 语句还是 else 语句,{代码块}都必须使用大括号{}括起来,否则只有首句有效
  3. if 以及else 语句的大括号都可以省略但是不建议省略容易造成误会降低可读性。

使用if-else来实现多路分支:

if (ch >= 65 && ch <= 90)
{
    printf("这是一个大写字母...\n");
}
else if( ch >= 'a' && ch <= 'z' ) {
    printf("这是一个小写字母...\n");
}
else if (ch >= '0' && ch <= '9')
{
    printf("这是一个数字...\n");
}
else{
    printf("这是一个其他的符号...\n");
}

多路分支

  • 逻辑:根据不同的条件执行不同的代码片段
  • 语法:
switch  ( 必须是一个整形表达式 )
{
    case 整形常量1 :
        代码片段1
        break ;   // 跳出语句 【不是必须的】

    case 整形常量2 :
        代码片段2
        break ;   // 跳出语句 【不是必须的】

    case 整形常量3 :
        代码片段3
        break ;   // 跳出语句 【不是必须的】
        
        ....
        .....
        .....
    case 整形常量n ... 整形常量n+X:   // 表示一个取值范围 在 n 与 n+X 之间
         代码片段N-1
        break ;   // 跳出语句 【不是必须的】                   
    
    case 整形常量N :
        代码片段N
        break ;   // 跳出语句 【不是必须的】

    default:   // 如果以上所有的CASE都不符合则进入defalue 语句中
        代码片段N+1
        break;
}
switch(n)
{
case 1:
    printf("one\n");
    break;

case 2:
    printf("two\n");
    break;
  
case 3:
    printf("three\n");
    break;
  
default:
    printf("其他数字\n");
}
  • 要点解析:
  1. switch(n) 语句中的 n 必须是一个整型表达式,即 switch 判断的数据必须是整型
  2. case 语句只能带整型常量,包括普通整型或字符,不包括 const 型数据。
  3. break 语句的作用是跳出整个 swtich 结构,没有 break 程序会略过下一个case语句的判断执行执行代码段
  4. default 语句不是必须的,一般放在最后面(因此不需要 break)
  5. 如果想判断一定的范围可以 使用...作为一个范围的选择 比如 1 ... 30 表示1到30之间

多路分支小怪练习:

    • 尝试使用if-else实现:
      • 用户从键盘中输入一个字符
      • 程序检测后输出字符对应的类型(大写、小写、数字、符号等)
    • 尝试使用switch-case实现
      • 用户从键盘输入一个颜色的首字母(不区分大小写)
      • 程序检测后输出对应的颜色单词
      • 例如:
        • 输入 g 输出 绿色
        • 输入 R 输出 红色

const

  • 逻辑:使一个变量不可修改
  • 作用:
    • 修饰普通变量,使之不可修改
    • 修饰指针变量,使之指向不可修改或者使其指向的目标的内容不可修改
  • 示例:
int const a = 100; // 定义了一个不可修改的变量a
const int b = 200; // 定义了一个不可修改的变量b
const int c ;  // 语法上没有问题,但是c的值完全没有任何作用

a = 101; // 错误
b = 202; // 错误

while与 do…while循环

  • 逻辑:使得程序中某一段代码可以重复循环地运行
  • 形式:
    • while 循环:先判断,再循环
    • do-while 循环:先循环,再判断

while循环

语法:

while( 布尔表达式 )   // 只要该表达式为真则代码块会被一直执行
{
    代码块
}

while循环:

入口判断

// 循环输出一系列整数,直到100为止
int a;
scanf("%d", &a);
while(a <= 100)
{
    printf("%d\n", a);
    a++;
}

do-while 循环

do-while循环:出口判断

// 循环输出一系列整数,直到100为止
int a;
scanf("%d", &a);
do
{
    printf("%d\n", a);
    a++;
}while(a <= 100);
  • 语法点:
    • while 循环先进行判断,条件为真后才执行循环体,因此循环体可能一遍也不执行。
    • do-while 循环先执行循环体,再进行判断,因此循环体至少会执行一遍。
    • do-while 循环中的 while 语句后面有分号;

for循环

  • 逻辑:与 while 循环类似,但更加紧凑,for 循环将控制循环的变量集中在一行

语法:

for ( 初始化语句 ; 条件判断语句 ; 循环变量迭代语句 )
{
    代码块    
}

注意:
    # 初始化语句  只会在进入for循环的时执行一次
    # 条件判断语句 每一次进入for 循环时都会执行判断
    # 循环变量迭代语句 在每一次循环结束后执行
    
流程:
    初始化 --> 判断是否满足 --> 执行代码块 --> 执行循环变量的迭代  

  • 示例:
// 循环输出一系列整数,直到100为止
int a;
for(a=30; a<=100; a++)
{
    printf("%d\n", a);
}

语法点:

    • 循环头的标准语法是: for(表达式1 ; 表达式2 ; 表达式3)
    • 表达式1一般用来初始化循环控制变量,只会执行一次
    • 表达式2一般用来作为循环判定条件,为真则进入循环,为假则跳出循环 , 每一次循环都需要先判断
    • 表达式3一般用来更新循环控制变量 , 在每一次循环结束后执行
    • 三个表达式均可以省略,但分号不能省略
for (;;)   // 死循环
{
    
}

break与continue

  • 逻辑:
    • break:① 跳出 switch 语句; ② 跳出当层循环体(包括while + for )
    • continue:结束当次循环,进入下次循环
  • 举例:
switch(n)
{
case 1:
    printf("one\n");
    break;  // 跳出 switch 语句
case 2:
    printf("two\n");
    break;        
}

while(1)
{
    int n = scanf("%d", &a);
    if(n == 0)
        break; // 跳出当层 while 循环体
}

for(int i=1; i<=100; i++)
{
    if(i%7 == 0)
        continue; // 跳过所有能被7整除的数
     
    printf("%d\n", i);       
}

goto语句(不建议使用)

  • 逻辑:无条件跳转

语法:


标签:
    


goto 标签;
  • 示例:
int main()
{
    printf("%d\n", __LINE__); // 打印第3行 
    
    // 无条件跳转到label处 
    goto label;
    printf("%d\n", __LINE__); // 打印第7行,此处被略过
label:  
    printf("%d\n", __LINE__); // 打印第9行
}
  • 语法:
    • goto语句直接跳转到本代码块中的标签处
    • 标签指的是以冒号结尾的标识符
  • 作用:
    • goto语句的无条件跳转不利于程序的可读性,一般不建议使用
    • goto语句在跳转的时候内存中的数据具有一定的不确定性
    • goto语句常被用在程序的错误处理中
Init()
{
    // 初始化LCD 设备
    if(error)
    {
        goto exit_lcd ;    
    }
    
    // 初始化 触摸屏设备
    if(error)
    {
        goto exit_touch ;    
    }
    
    // 初始化蓝牙设备
    if(error)
    {
        goto exit_Bt ;    
    }

    // 初始化网络设备
    if(error)
    {
        goto exit_Net ;    
    }

exit_Net:
    // 释放网络设别
exit_Bt:
    // 释放蓝牙设别
exit_touch:
    // 释放触摸屏资源
exit_lcd:
    // 释放LCD的资源
}

总结

        本文细讲了打怪路上的运算符怪和控制流怪的特点和消灭方法,各位只需认真学习,即可消灭它们。祝各位都可爬上C语巅峰,斩尽拦路小妖。

        本文参考 粤嵌文哥 的部分课件,经过整理和修改后发布在C站。如有转载,请联系本人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/189042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows系统管理之备份与恢复

本章目录&#xff1a; 一. 本章须知&#xff1a; 前置条件 需要创建一个新的磁盘 前置条件2 给新添加的磁盘分盘 二. 了解开启并学会使用Windows sever backup 如何使用备份与恢复“备份计划”“一次性备份”“恢复” 最后是用命令行“一次性备份命令 ”完成一次备份 话不多说 …

常见位运算的详讲!

今日为大家详细讲解一番关于常见位运算的操作&#xff0c;本文主要介绍一些位运算的操作符&#xff0c;然后再通过简单->中等->困难的例题&#xff0c;让大家彻底搞懂关于位运算的知识&#xff01; 位运算的介绍&#xff01; 1.基础位运算 ">>"右移操作…

纵观手机市场,手机即鏖战全面屏

9月13日&#xff0c;在相继发布Apple TV、Apple Watch 和iPhone 8/8 Plus之后&#xff0c;当大家都以为苹果新品发布会临近结束之时&#xff0c;苹果前CEO史蒂夫乔布斯的这句经典名言再现屏幕&#xff0c;iPhone X终于揭开了神秘面纱。 “One more thing”。 9月13日&#xff…

第一百七十九回 自定义SlideImageSwitch

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"SlideSwitch组件"相关的内容&#xff0c;本章回中将介绍自定义SlideImageSwitch.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概…

4、LED闪烁

LED亮灭 使用STC-ISP软件的延时计算器自动生成延迟子函数 #include <REGX52.H> #include <INTRINS.H>//延迟函数 void Delay500ms() //12.000MHz {unsigned char i, j, k;//_nop_()需要导入<INTRINS.H>包_nop_();i 4;j 205;k 187;do{do{while (--k);}…

【数据库篇】关系模式的表示——(2)规范化

范式&#xff1a;范式是符合某一种级别的关系模式的集合 规范化&#xff1a;是指一个低一级的范式的关系模式&#xff0c;通过模式的分解转换为若干个高一级范式的关系模式的集合。 1NF 每个分量必须是不可分开的数据项&#xff0c;满足这个条件的关系模式就是1NF。 2NF 若…

c语言判断三角形

以下是一个用C语言编写的程序&#xff0c;用于判断输入的三个数能否构成三角形。 #include <stdio.h>int main() { int a, b, c; printf("请输入三角形的三条边长&#xff1a;\n"); scanf("%d%d%d", &a, &b, &c); if (a b…

为什么淘宝取消双12活动?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 淘宝取消双12活动了&#xff0c;这条消息犹如一颗重磅炸弹&#xff0c;在整个电商圈中引发了轩然大波。 不过呢&#xff0c;淘宝为了过度&#xff0c;把双12改了个名字叫“好价节”。估计是官方都…

isis基础大全学习案例

R1配置&#xff1a; isis 1 is-level level-2 //本区域只启用level-2级别 cost-style wide //默认为narrow窄度量&#xff0c;开销只能最大63&#xff0c;并且不能打tag&#xff0c;wide宽度量的tlv和narrow不匹配&#xff0c;不能相互计算路由&#xff0c;两边都要改。 netwo…

Kotlin学习——kt里的集合List,Set,Map List集合的各种方法之Int篇

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

自动化部署 扩容openGauss —— Ansible for openGauss

前言 大家好&#xff0c;今天我们为大家推荐一套基于Ansible开发的&#xff0c;自动化部署及扩容openGauss的脚本工具&#xff1a;Ansible for openGauss&#xff08;以下简称 AFO&#xff09;。 通过AFO&#xff0c;我们只需简单修改一些配置文件&#xff0c;即可快速部署多种…

JavaScript基础—运算符、表达式和语句、分支语句、循环语句、综合案例-ATM存取款机

版本说明 当前版本号[20231125]。 版本修改说明20231125初版 目录 文章目录 版本说明目录JavaScript 基础 - 第2天运算符算术运算符赋值运算符自增/自减运算符比较运算符逻辑运算符运算符优先级 语句表达式和语句分支语句if 分支语句if双分支语句if 多分支语句三元运算符&am…

人工智能时代的内容写作

内容不再只是王道&#xff0c;正如俗话所说&#xff1a;它是一种流动的货币&#xff0c;推动了巨大的在线信息和影响力经济。 每个品牌都是一个故事&#xff0c;通过其服务和商品讲述自己。尽管如此&#xff0c;大多数客户还是会通过您的在线内容最了解您。 但随着我们进入人…

鸿蒙HarmonyOS 编辑器 下载 安装

好 各位 之前的文章 注册并实名认证华为开发者账号 我们基实名注册了华为的开发者账号 我们可以访问官网 https://developer.harmonyos.com/cn/develop/deveco-studio 在这里 直接就有我们编辑器的下载按钮 我们直接点击立即下载 这里 我们根据自己的系统选择要下载的系统 例…

Linux操作系统之apt常用命令记录

文章目录 apt 命令apt 语法apt 常用命令列出所有可更新的软件清单命令升级软件包列出可更新的软件包及版本信息升级软件包&#xff0c;升级前先删除需要更新软件包安装指定的软件命令&#xff1a;安装多个软件包&#xff1a;更新指定的软件命令显示软件包具体信息,例如&#xf…

MYSQL基础之【创建数据表,删除数据表】

文章目录 前言MySQL 创建数据表通过命令提示符创建表使用PHP脚本创建数据表 MySQL 删除数据表在命令提示窗口中删除数据表使用PHP脚本删除数据表 后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主…

搜索 C. Tic-tac-toe

Problem - C - Codeforces 思路&#xff1a;搜索&#xff0c;判断合法性。从起始态用搜索进行模拟&#xff0c;这样可以避免后面判断合法性这一繁琐的步骤。用一个map进行映射当前态及对应的结果。剪枝&#xff1a;如果当前字符串已经被搜索过&#xff0c;则直接跳过去。 代码…

如何在3dMax中根据AutoCAD地形规划文件对地形进行建模?

在3dMax中根据Autocad地形规划文件对地形进行建模的方法 直入主题&#xff0c;要根据包含地形图的DWG (Autocad) 文件进行地形建模&#xff0c;方法步骤如下&#xff1a; 1.运行3dmax软件&#xff0c;点击“文件&#xff08;File&#xff09;->导入&#xff08;Import&…

【RTP】RTPSenderAudio::SendAudio

RTPSenderAudio 可以将一个opus帧封装为rtp包进行发送,以下是其过程:RTPSenderAudio::SendAudio :只需要提供payload部分 创建RtpPacketToSend 并写入各个部分 填充payload部分 sender 本身分配全session唯一的twcc序号 if (!rtp_sender_->

pandas根据列正逆序排序

题目&#xff1a;根据 buy_quantity 列进行排名&#xff0c;相同值分配相同的最低排名。 import pandas as pd# 创建一个示例 DataFrame data {item_id: [1, 2, 3, 4, 5, 6, 7], buy_quantity: [1, 2, 2, 3, 3, 4, 5]} df pd.DataFrame(data)# 使用 rank() 函数为 buy_quant…