C语言中的运算成分(Week 8)

赋值运算符

  • “=”赋值运算符

    • 给赋值号左边的变量赋予数值
  • 在变量定义的同时可以为变量赋初值
  • 要点一:两面类型不同
    • 若=两边的类型不一致,赋值时要进行类型转换
    • 不管=右边是什么类型,都转为=左边的类型
    • cout打印默认6位精度
  • 要点二:长数赋给短数
    • 截取长数的低n位送给短数
  • 要点三:短数赋给长数
    • 低位不变,高位全补0或1
  • 要点四:符号位的赋值处理
    • 直接搬运,不管符号位还是数字位

表达式

  • 程序中由运算符、操作数和括号等所组成的计算式,是计算求值的基本单位。(赋值语句也是运算符)
  • 表达式是有“值”的,赋值语句也不例外
(i = 10) // 10
(i = i + i) // 20
  • 复合的赋值运算

    • 在赋值符号前面加上其他运算符号构成复合赋值运算

      • a += 3 // a = a + 3
      • x *= y + 8 // x = x * (y+8)
      • x %= 3 // x = x % 3
  • 连续的赋值运算

    • 自右向左的结合顺序

      • a = b = 5 // a = 5, b = 5
      • a = b = c = 5 // 同上
      • int a=b=c=5 // 编译错误!!!

算术运算符&算术表达式

  • 基本的算术运算:+、-、*、/、%

    • %是模运算,求余,两侧都必须是整数
  • 注意

    • 整数运算,结果仍为整数
    • 实数运算,结果为double型
    • 舍入的方向随编译器的不同而不同
  • 算术运算符的优先级

    • ()
    • * / %
    • + -
    • 在同一级别中,按结合方向处理
    • 可以用剪刀法求表达式的值,从右往左砍,砍最低优先级的算术运算符,最后被砍下来的表达式优先计算。
  • 计算过程中的类型转换

    • float➡️double
    • char、shoet➡️int
  • 自增、自减运算符:使变量的值+1或-1

    • ++i --i ——先计算再使用
    • i++ i-- ——先使用再计算
    • ++只能用于变量,不能用于表达式
    • (-i)++❌ ++i++ ❌
    • cout的时候,从右往左计算值(不同编译器规则可能不同)

关系运算符

  • 优先级 </<=/>/>= ➡️==/!=
  • 关系运算表达式的值:“真”/“假
  • 总优先级:算术运算符➡️关系运算符➡️赋值运算符

逻辑运算符

  • 三种逻辑运算符

    • 逻辑 &&
    • 逻辑 ||
    • 逻辑 !
  • 逻辑表达式的值:0or1

  • 优先级:!➡️&&➡️||

  • 混合运算的优先级:!➡️算术运算符➡️关系运算符➡️&& ||➡️赋值运算符

  • 在不确定优先级的情况下,通过加括号解决。

  • ||两边当左侧为1,右侧将不会计算

  • &&两边当左侧为0时,右侧将不会计算

  • 只有在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。

运算对象的扩展

  • 逻辑运算符两侧可以是任何类型

    • 如字符型、实型或指针型等
    • 系统最终以0和非0来判别他们

逗号,条件,强转

逗号运算符

  • 用逗号把两个表达式连起来

    • 表达式1,2,3……
    • 先求表达式1,再2,3……,整个表达式的值为表达式n的值

条件运算符

表达式1?表达式2:表达式3

  • 如果1为真,则返回2,否则返回3

强制类型转换

  • 注意:只转换表达式的,被转换的量的类型并没有发生变化。

位运算(选讲)

  • 位运算就是指进行二进制位的运算

  • C++中的位运算符

    • 按位与(&) 双目

      参加运算的两个数据,各数位均独立进行“”运算

    • 按位或(|) 双目

      参加运算的两个数据,各数位均独立进行“”运算

    • 按位异或(^)XOR运算符 双目(参与运算的两者结果一样为0,结果不同为1)

      参加运算的两个数据,各数位均独立进行“异或”运算

    • 取反(~) 单目

      按位取反

    • 左移(<<) 单目

      左移若干位,高位溢出,低位补0

      左移1位相当于*2,左移2位相当于*2*2

    • 右移(>>) 单目

      右移若干位,低位溢出,高位补0(无符号数)

      右移1位相当于/2,右移2位相当于/2/2(当没有非零数位溢出时)

      • 右移运算符号位的处理

        对无符号数,补0

        对有符号数:若原本为正数,补0;若原本为负数,则补0or1取决于计算机系统

        若补0,称为逻辑右移或简单右移;若补1,称为算术右移(VC)

  • 不同长度的数据进行位运算

    • 右端对齐
    • 如果短数位无符号整数or有符号正数:补满0,否则补满1。
  • 位运算+赋值运算 = 复合赋值运算(&= |=……)

  • 优先级:~ ➡️<< >>➡️ & ^ |

  • 作用:

    • 按位与:取一个数中某些指定位

    • 按位或:对一个数据的某些位取定值为1

    • 异或运算:使特定位反转(与1异或),使特定位保持一样(与0异或)

      交换两个值不用临时变量:a=ab;b=ba;a = a^b;

练习题

Quiz1 点评赛车

#include <iostream>
using namespace std;
int main()
{
int best;
for (int best = 1; best <= 4 ; best++) {
bool a = (best == 2);
bool b = (best == 4);
bool c = !(best == 3);
bool d = !b;
if(a + b + c + d != 1)
continue; cout << best << endl;
if ( a == 1)
cout << "A" << endl;
else if ( b == 1)
cout << "B" << endl;
else if ( c == 1)
cout << "C" << endl;
else
cout << "D" << endl;
}
return 0;
}

Quiz2 数字求和

#include <iostream>
using namespace std;
int main()
{
int a,b[5];
cin >> a;
for (int i = 0; i < 5; i++)
{
cin >> b[i];
} int sum = 0;
for (int i = 0; i < 5; i++) {
if(b[i] < a)
sum += b[i];
} cout<<sum<<endl;
}

Quiz3 骑车与走路

#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int issue[n];
for (int i = 0; i < n; i++) {
cin >> issue[i];
} for (int i = 0; i < n; i++) {
double ride = 50.0 + double(issue[i]) / 3.0;
double walk = double(issue[i]) / 1.2;
if(ride < walk)
cout<<"Bike"<<endl;
else if(ride > walk)
cout<<"Walk"<<endl;
else
cout<<"All"<<endl;
} return 0;
}

Quiz4 买房子

#include <iostream>
#include <cmath> using namespace std;
int main() {
int n, k;
while (cin >> n >> k) {
int i;
for (i = 1; i <= 20; i++) {//20之前,直接输出,如果到了20,若不能买下,则输出impossible,结束
if (n * i > 200 * pow((1 + k / 100.0), i - 1)) {
cout << i << endl;
break;
}
else if (i == 20)
cout << "Impossible" << endl;
}
}
return 0;
} //这个题我莫名其妙的纠结了好久……

Quiz5 找和为K的两个元素

#include <iostream>
using namespace std;
int main()
{
int n,k;
cin >> n >> k;
int a[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
} for (int i = 0; i < n-1; i++) {
for (int j = i+1; j < n; j++) {
if(a[i] + a[j] == k)
{
cout<<"yes"<<endl;
return 0;
}
}
}
cout<<"no"<<endl;
return 0;
}

Quiz6 自整除数

#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n; for (int i = 10; i <= n; i++) {
if(i % (i / 10 + i % 10) == 0)
cout<<i<<endl;
} return 0;
}

Coursera课程笔记----计算导论与C语言基础----Week 8的更多相关文章

  1. Coursera课程笔记----计算导论与C语言基础----Week 6

    理性认识C程序 导论(Week 6) 明确学习进度 讲课内容 感性➡️理性➡️函数➡️指针等 作业练习 初级阶段 ➡️正常作业练习 C语言的由来 程序设计语言的分类 低级语言之机器语言 0010101 ...

  2. Coursera课程笔记----计算导论与C语言基础----Week 7

    C语言中的数据成分(Week7) 内存 把内存想象成长带,带子上有许多方格,每个方格有8位(8bit) 2^10 = 1024 1B = 8 b 1KB = 1024Byte MB.GB.TB.PB- ...

  3. Coursera课程笔记----计算导论与C语言基础----Week 4

    感性认识计算机程序(Week 4) 引入 编程序 = 给计算机设计好运行步骤 程序 = 人们用来告诉计算机应该做什么的东西 问题➡️该告诉计算机什么?用什么形式告诉? 如果要创造一门"程序设 ...

  4. Coursera课程笔记----计算导论与C语言基础----Week 2

    计算机的历史与未来(Week 2) 计算机历史 早期计算机:手工计算器➡️机械计算器➡️计算机原型 现代计算机:电子管计算机➡️晶体管计算机➡️集成电路计算机➡️超大规模集成电路 早期的手工计算辅助工 ...

  5. Coursera课程笔记----计算导论与C语言基础----Week 9

    C语言中的控制成分(Week 9) 计算机程序的基本结构 任何具有单入口单出口的程序,都可以用顺序结构.分支结构.循环结构来表达 分支语句 在执行if语句前,先对表达式求解 if()内可以是任意的数值 ...

  6. Coursera课程笔记----计算导论与C语言基础----Week 3

    存储程序式计算机 冯·诺伊曼式计算机 "关于EDVAC的报告草案" 组成:控制器(协调工作).运算器(算数&逻辑运算).存储器(存储操作信息和中间结果).输入设备.输出设备 ...

  7. Coursera课程笔记----计算导论与C语言基础----Week 1

    计算机的基本原理(Week 1) 第一次数学危机 公元前500年,毕达哥拉斯学派,他们相信数是万物的本源:一切数均可表示成整数或者整数之比 然而毕达哥拉斯证明了勾股定理,某些直角三角形的三边比不能用整 ...

  8. Coursera课程笔记----计算导论与C语言基础----Week 12

    期末编程测试(Week 12) Quiz1 判断闰年 #include <iostream> using namespace std; int main() { int year; cin ...

  9. Coursera课程笔记----计算导论与C语言基础----Week 11

    C程序中的字符串(Week 11) 字符数组 所有的字符串,都是以\0结尾的 只能在数组定义并初始化的时候:char c[6] = "China"; 不能用赋值语句将一个字符串常量 ...

随机推荐

  1. qt creator源码全方面分析(4-1)

    目录 d指针和q指针 简单示例 q指针 QObject和QObjectPrivate qtcreator中的变体1 qtcreator中的变体2 小结 d指针和q指针 我们在类成员名称和使用d指针中, ...

  2. 小波变换在matlab中的使用

    对信号进行一层分解 clc; clear; % 获取噪声信号 load('matlab.mat'); sig = M(1,1:1400); SignalLength = length(sig); %使 ...

  3. spring源码阅读笔记08:bean加载之创建bean

    上文从整体视角分析了bean创建的流程,分析了Spring在bean创建之前所做的一些准备工作,并且简单分析了一下bean创建的过程,接下来就要详细分析bean创建的各个流程了,这是一个比较复杂的过程 ...

  4. Extended Traffic LightOJ - 1074 (经典SPFA问题)

    题目大意:每一个城市都有一定的繁荣度,然后给出m条有向边i->j,定义这条边的权值为pow(arr[j]-arr[i],3),然后给你q个询问,每个询问输入一个x. 然后问你点1到x的距离,如果 ...

  5. ATcoder E - Flatten 质因子分解求LCM

    题解:其实就是求n个数的lcm,由于数据特别大,求lcm时只能用质因子分解的方法来求. 质因子分解求lcm.对n个数每个数都进行质因子分解,然后用一个数组记录某个质因子出现的最大次数.然后累乘pow( ...

  6. 判断一个字符串是否是合法IP地址

    # -*- coding: utf-8 -*- """ @File:test06_判断ip地址是否合法.py @E-mail:364942727@qq.com @Time ...

  7. Java前台传值至后台中文乱码

    记一次常见问题 今天导入了一个网上下载的项目,运行后发现,前台传值 到Servlet,Servlet保存至数据库,数据库保存的中文数据出现乱码,检查了一下表中的编码是utf8没错. 输出测试了一下 原 ...

  8. C#开发BIMFACE系列33 服务端API之模型对比4:获取模型对比结果

    系列目录     [已更新最新开发文章,点击查看详细] 模型对比可以对两个文件/模型进行差异性分析,确定两个文件/模型之间构件的几何和属性差异,包括增加的构件.删除的构件和修改的构件. 模型对应可以用 ...

  9. 重装anaconda的记录,包含设置jupyter kernel

    anaconda安装记录 官网下载最新版 linux:sh xx.sh 注意不要敲太多回车,容易错过配置bash的部分,还要手动添加 (vim ~/.bashrc 手动添加新bash,卸载时也要删掉此 ...

  10. python 进阶篇 python 的值传递

    值传递和引用传递 值传递,通常就是拷贝参数的值,然后传递给函数里的新变量,这样,原变量和新变量之间互相独立,互不影响. 引用传递,通常是指把参数的引用传给新的变量,这样,原变量和新变量就会指向同一块内 ...