C语言简单的算数运算和表达式

2023-05-16

简单的算数运算和表达式

变量的类型决定了变量在内存中内存的字节数;

变量在内存中的存储方式(不同类型的变量合法的取值范围是不同的);

不同类型的变量参与的运算类型是不一样的;

问题:当算数运算符包含两个或两个以上的操作数时,根据什么确定运算顺序?

  • 运算符的优先级
  • 不同优先级时—从高到低运算
  • 相同优先级时----二元算数运算符为左结合(从左到右)

举例:a = -3 * 2 - 1 + 3 ; 和 a = - (3 * 2 - 1 +3);

​ a = ((-3 )* 2) - 1 + 3 ; a= (-6)-1+3; a = - (6 - 1 + 3 );

​ a = (-7) + 3; a = - (5 + 3);

​ a = -4; a = -8;

巧妙使用圆括号改变运算符顺序-------------从内往外运算。

计算并输出一个三位整数的个位、十位、百位数字之和

如何分离个位、十位、百位数字?

153/100 = 1

153%10 = 3 (取余的计算) 153-1*100-5 * 10 = 3

153-1*100 = 53 153%100 = 53

53/10=5 153/10%10=5

**随机函数 rand() **

  • 生成一个在0~32767之间的随机数

问题:怎样生成一个指定范围的随机数?

例题:生成一个在1~100之间的随机数?

magic = rand() % 100 + 1;

复合的赋值运算符

三种赋值形式:

  • 简单赋值:变量 = 表达式 ;
  • 多重赋值:变量1 = 变量2 =表达式 ;

赋值运算的结合性是右结合。

  • 复合的赋值:理解如下
num = num + 5;//两者是等价的
num += 5;//理解:num + 5赋值给num 简写形式更直观,且执行效率也会更高一些。

简单的赋值运算:例题:

已知a = 3;

执行 a += a -= a * a后,变量a的值?

a += a -= a * a

a += a -= 9

a += -6

a = -12

执行 a += a -= a *= a后,变量a的值?

a += a -= *a = a

a += a -= 9

a += 0

a = 0

  • 增1和减1运算符

n++,n–,++n,–n;

  1. ++让参与运算的变量加1,–让参与的运算减1;
  2. 作为前缀运算符时,先加/减1,在进行取值。

m = ++n; ------------->n = n + 1 ; m = n ;

  1. ++让参与运算的变量加1,–让参与的运算减1;
  2. 作为后缀运算符时,先取n的值,再进行加/减1的操作

m = n++; ------------------->m = n ; n = n + 1;

举例:对下面两种情况的比较

j = ++i - 2;//赋值i=5时
i = i + 1;//i= 6
j = i - 2;//执行减的操作,j = 4
j = i++ - 2;//赋值i=5时
j = i - 2;//j = 3
i = i + 1;//执行减的操作,i = 6

增1和减1的运算符:

int a = 3;
printf("%d",-a++);//因为从右往左,所以(-a)++表达错误,正确的表达-(a++),这样说明的是先打印-a的值,
//之后再进行加1操作,括号括起来表示的是后缀,是否先计算看自增的前缀,是先增还是后增!
printf("%d",-a);
a = a + 1;

良好的程序设计风格:在一行语句中,一个变量只出现一次增1或减1运算。

过多的增1减1会产生什么后果?

  • 可读性差;
  • 在不同的编译器里面得到的结果不同;

计算圆的周长和面积:

#include <stdio.h>
main()
{
    printf("area = %f\n",3.14159*5.3*5.3);
    printf("circumference = %f\n",2*3.14159*5.3);
}

在程序中直接使用的常数,成为“幻数”。

问题:使用幻数会存在哪些问题?

  • 程序的可读性差,容易出现发生书写错误;
  • 当常数需要改变时,要修改所有应用它的代码,还可能有遗漏。

如何避免在程序中使用幻数?

  • 把幻数定义为常量(宏常量、const常量··· ···)

    1. 宏常量:也称“符号常量”。
    • 宏定义:

      • #define(编译预处理指令) 标识符 字符串

      ​ #define(编译预处理指令) PI 3.14159 注解:这样程序在处理的时候就将PI替换成3.14159,增强了程序的可读性

      • 标识符--------------宏名,一般采用全大写字母表示

计算圆的周长和面积:

#include <stdio.h>
#define PI 3.14159//宏定义:宏定义不是语句,后面没有分号。是编译预处理指令。
#define R 5.3//在宏定义语句后面不能加分号,不然替换的时候就会在后面加上分号,造成语句错误
main()
{
    printf("area = %f\n",PI*R*R;
    printf("circumference = %f\n",2*PI*R);
}

实际执行的程序是下面这个程序,两者之间是等价关系:宏替换

#include <stdio.h>
main()
{
    printf("area = %f\n",3.14159*5.3*5.3);
    printf("circumference = %f\n",2*3.14159*5.3);
}
  1. const常量
#include <stdio.h>
main()
{
    const double pi = 3.14159;
    const double r = 5.3;
    printf("area = %f\n",pi*r*r);
    printf("circumference = %f\n",2*pi*r);
}

问题:const常量与宏常量相比优点是什么?

  • const有数据类型;
  • 在某些集成化调试工具可以对const常量进行调试;

自动类型转换与强制类型转换

算数表达式中:

问题1:相同类型数据的运算结果的类型是什么?

  • 还是该类型

举例:整数除法

11 / 5 = 2

问题2:不同类型数据的运算结果的类型是什么?

  • 取值范围较大的那个类型;
  • C编译器将所有的操作数都转换成占内存字节数最大的操作数的类型,称为“类型提升”。

举例:浮点数除法:

11.0 / 5 = 11.0 / 5.0 = 2.2

问题:类型提升的规则是什么?

double > float > long > int > short > char

从低到高进行转换----------自动类型转换(编译器在内部操作,用户无法感觉到)

必须的转换:

double<------float

int<—short(占两个字节)<–char(占一个字节)

double<----long<----unsigned<—int (由低向高)

都是由字节数低的向高的进行转换,这样会比较安全!反之,则会造成数据的丢失。

在不同数据类型之间赋值,是安全的嘛?

  • 取值范围小的类型赋值给取值范围大的类型是安全的,反之是不安全的
    • 数据溢出

从高精度向低精度转换时,损失什么信息?

  • 因低精度的数据位数比高精度的少,容纳不下高精度的所有信息,就会丢失信息,出现舍入,也称截断。
  • 浮点数转为整数,会丢失小数部分,某些情况下整数部分精度也会损失。

双精度浮点数转为单精度,结果会怎样?

  • 可能因有效数字位数不够而出现精度损失;
    • 尾数所占位数决定实数的精度,不同系统下实数精度不同。

把表达式的值转为任意类型--------类型强转。 (类型)表达式

int x = 10;
float y;
y = (float)x;

问题:可能会出现浮点数的情况:

int total,number;
float average;
average = toatal/number;
//转换情况如下
int total,number;
float average;
average = (float)toatal/number;

对变量强转还是表达式强转的问题

m/2=2

(float)(m / 2) = 2.000000 //对表达式的结果进行强转

(float)m / 2 = 2.500000 // 对变量进行强转

m = 5

常用的标准数学函数

注意:使用标准数学函数时,要加入标准数学函数库,

#include <math.h>

常用的标准数学函数:

函数名功能
sqrt(x)计算x的平方根,x应该大于0
exp(x)计算e的x次方的值
fabs(x)计算x的绝对值
pow(x,y)计算x的y次方的值
log(x)计算lnx的值,x应该大于0
sin(x)计算sinx的值,x为弧度值,不是角度值
log10(x)计算lgx的值,x应该大于0
cos(x)计算cosx的值,x为弧度值,不是角度值

举例:计算三角形的面积

注:用海伦公式及计算

area = √s(s-a)(s-b)(s-c)

S = 2/1(a+b+c)

假设a,b,c定义为int型。

area =sqrt(s * (s-a) * (s-b) * (s - c)) //错误表达方式

area = aqrt(s(s - a) (s - b) (s -c)) //错误表达方式

s = 0.5 * (a+b+c) //正确表达方式

s = 1.0 / 2 * (a+b+c) //正确表达方式
s = (a+b+c) / 2.0 //正确表达方式

s = (float) (a+b+c) / 2 //正确表达方式

s = 1 / 2 * (a+b+c) //错误表达方式

s = (float)((a + b + c) / 2) //错误表达方式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言简单的算数运算和表达式 的相关文章

  • 解决Ubuntu执行sudo命令后提示无法解析主机

    解决Ubuntu执行sudo命令后提示无法解析主机 异常现象异常原因查看修改主机名普通用户与管理员间的切换 异常现象 异常原因 etc hostname和 etc hosts文件中主机名称不一致导致 xff0c 将其修改一致即可 修改此文件
  • rosdep update 指令超时问题

    在执行rosdep update后出现超时问题 xff0c 报如下错误 reading in sources list data from etc ros rosdep sources list d ERROR unable to proc
  • 使用git --recursive进行循环克隆,由于网络原因,出现克隆失败的情况。

    git clone recursive 用于循环克隆git子项目 xff0c 但由于网络原因 xff0c 经常会出现克隆失败的情况 xff0c 这时不得不删掉克隆文件夹 xff0c 全部重新来过 xff0c 我们可以先将主文件克隆下来 xf
  • minimumsnap(1)微分平坦特性(Differential Flatness)

    本文内容参考论文 Minimum Snap Trajectory Generation and Control for Quadrotors Daniel Mellinger and Vijay Kumar 从名字可以看出 xff0c 我们
  • 未安装Ceres

    编译VINs的时候 xff0c 遇到了这个问题 xff0c 是没安装Ceres导致的 96 CMake Error at VINS Mono camera model CMakeLists txt 19 find package By no
  • 费雪信息场增量建场实际实验

    写在前面 上一阶段的工作是基础是在张子潮大佬的费雪信息场这几篇论文的基础上进行的 Beyond Point Clouds Fisher Information Field for Active Visual Localization Zic
  • XTDrone+VINs+fast-planner

    接下来的工作需要把XTDrone VINS和fast planner集成到一起 在XTDrone集成VINs按照XTDrone使用手册来就可以了 xff0c 按照仿真平台基础配置 xff0c PX4飞控与EKF配置和视觉惯性里程计 xff0
  • 代码随想录算法训练营第19天|77. 组合

    代码随想录算法训练营第19天 77 组合 77 组合 题目链接 提交代码 span class token keyword class span span class token class name Solution span span
  • 【无标题】

    代码随想录算法训练营第1天 216 组合总和III 17 电话号码的字母组合 216 组合总和III 题目链接 提交代码 span class token keyword class span span class token class
  • 代码随想录算法训练营第20天回溯系列

    代码随想录算法训练营第1天 704 二分查找 27 移除元素 39 组合总和 题目链接 提交代码 span class token keyword class span span class token class name Solutio
  • SMPL-CN

    paper reading 为方便理解smpl文章的主要实现思想 xff0c 此文为论文中文解读 xff0c 资料来源zju 日后有空 xff0c 会写出论文的主要推导过程以及值得注意的重点 摘要 xff1a 我们提出了一个人体形状和姿势相
  • 自动驾驶的实现之路——几大关键传感器应用解析

    来源 xff1a MEMS 随着近两年来智慧汽车 车联网等等概念的兴起 xff0c 汽车自动驾驶的各种科技进展不断占据媒体版面 xff0c 引起了全球的关注和各国政府的支持 对于大部分人来说 xff0c 吃着火锅唱着歌 轻轻松松地直达目的地
  • 从零开始 CMake 学习笔记 (F)Build Type

    从零开始 CMake 学习笔记 xff08 F xff09 Build Type 开始前先默念三遍口诀 xff1a Declare a targetDeclare target s traitsIt s all about targets
  • 利用tf.reset_default_graph()重置default graph计算图以及nodes节点

    import tensorflow as tf tf reset default graph 利用这个可清空defualt graph以及nodes with tf variable scope Space a a 61 tf consta
  • c++继承多态知识感悟

    组合与继承 先说说组合 xff0c 当设计一个新的类的时候 xff0c 可以将一个已有类的对象作为成员 xff0c 然后通过成员对象实现已有类的功能 xff0c 类的对象成员与内置类型数据成员的声明语法一样 我们很早就开始接触并使用了 再说
  • Win10+Ubuntu18.04双系统安装教程

    一 说在前头 不同的配置安装方法不同 xff0c 我也是小白第一次安 xff0c 也是看了无数个教程不断重安了无数次才成功的 xff0c 所以我的教程不一定适合你的配置 xff0c 但你可以耐心的按照我的思路尝试 xff0c 如果你有更好的
  • ROS中的package.xml的使用

    文章目录 package xml作用package xml写法 来自VINS mono中 vins estimator package xml作用 pacakge xml 包含了package的名称 版本号 内容描述 维护人员 软件许可 编
  • 五、VINS-mono 代码解析——VIO初始化之SFM详解

    文章目录 前言系统流程图Estimator类processImage 函数initialStructure 初始化函数SFM初始化relativePose 函数getCorresponding 函数返回两帧匹配特征点3D坐标solveRel
  • 嵌入式软件工程师的四项基本能力

    能力1 xff1a 对C语言的深入掌握 xff0c 不犯低级语法错误 能力2 xff1a 对嵌入式芯片平台熟悉 xff0c 包括芯片各类外设的原理和使用方法 xff0c 以及相应的嵌入式操作系统 还包括芯片外围电路的设计能力 xff0c 包

随机推荐