标准C语言(3)
操作符用来描述对数字的处理规则根据操作符所需要配合的数字个数把操作符分为单目操作符,双目操作符和三目操作符
C语言里用+,-,*和/表示加减乘除四则运算,它们都是双目操作符,如果参与除法计算的两个数字都是整数则计算结果保留整数部分
C语言里用%表示取余操作
赋值操作符用=表示它可以把一个数字记录到一个存储区里,赋值语句可以当作数字使用,这个数字就是赋值完成后左边存储区里的数字,可以在一条语句里使用多个赋值操作符,这个时候先计算右边的赋值操作符
C语言里绝大多数双目操作符可以和赋值操作符合并形成复合赋值操作符(例如+=,/=等)复合赋值操作符要求左边的内容必须代表存储区,右边的内容必须代表数字,复合赋值操作符可以把双目操作符的计算结果记录到左边的存储区里,复合赋值操作符的优先级和赋值操作符优先级一样低
/*
* 操作符演示
* */
#include <stdio.h>
int num2;
int main() {
char ch = 0;
int num = 0, num1 = 0;
printf("15 / 6是%d\n", 15 / 6);
printf("15 %% 6是%d\n", 15 % 6);
num = ch = 300;
printf("num是%d\n", num);
num += 6;
printf("num是%d\n", num);
num *= 2 + 3;
printf("num是%d\n", num);
num = 10;
num++;
printf("num是%d\n", num);
++num;
printf("num是%d\n", num);
num = 10;
num1 = num++;
printf("num是%d,num1是%d\n", num, num1);
num1 = ++num;
printf("num是%d,num1是%d\n", num, num1);
num = 10;
num1 = num++ + ++num;
printf("num是%d,num1是%d\n", num, num1);
num2 = 10;
num1 = num2++ + ++num2;
printf("num2是%d,num1是%d\n", num2, num1);
return 0;
}
自增操作符(++)和自减操作符(--)都是单目操作符,这两个操作符必须和存储区配合使用,它们可以把存储区里的内容做加一或减一操作,它们都有两种使用方法,一种是前操作(把操作符写在存储区的前面),另外一种是后操作(把操作符写在存储区的后面)这两个操作符编写的表达式本身也可以当作数字使用,前操作当数字使用的时候是修改后的数字,后操作当数字使用的时候是修改前的数字不要在一条语句里对同一个变量多次进行自增或自减计算,因为结果不确定
逻辑表达式的结果只能是布尔值,逻辑操作符用来编写逻辑表达式
!是一个单目逻辑操作符,它可以根据一个布尔值计算相反的布尔值(求反),这个操作符使用的时候应该写在一个布尔值的前面
双目逻辑操作符包括等于(==),不等于(!=),大于(>),小于(<),大于等于(>=)和小于等于(<=)
/*
* 逻辑操作符演示
* */
#include <stdio.h>
int main() {
int num = 0;
printf("!8是%d\n", !8);
printf("3 < 7 < 5是%d\n", 3 < 7 < 5);
printf("3 < 7 && 7 < 5是%d\n", 3 < 7 && 7 < 5);
1 || ++num;
printf("num是%d\n", num);
0 && ++num;
printf("num是%d\n", num);
return 0;
}
最多包含一个双目逻辑操作符的表达式叫简单逻辑表达式,这种表达式的结果在数学里和计算机里一定是一样的,计算机里所有复杂逻辑表达式必须首先拆分成多个简单逻辑表达式然后再合并
可以使用与(&&)和或(||)操作符把两个逻辑表达式合并成一个
只有两个逻辑表达式的结果都是真的时候用与(&&)合并,以后结果才是真,否则结果是假,只要两个逻辑表达式里有一个的结果是真则用或(||)合并后的结果就是真
与(&&)和或(||)都具有短路特征(如果前一个逻辑,表达式的结果可以决定合并后整个逻辑表达式的结果就忽略后一个逻辑表达式)
位操作符可以直接操作二进制数位的内容
~是一个单目位操作符,这个操作符可以根据一个数字计算出另外一个数字,这两个数字的所有二进制数位内容都不一样,这种操作叫按位求反,这个操作符应该写在一个数字的前面
双目位操作符包括按位与(&),按位或(|)和按位异或(^),它们可以把两个数字对应二进制数位的内容进行计算
按位与(&)可以把两个数字对应数位的内容做与计算,只要一个数位的内容是0则与计算以后结果就是0
3 0000 0011
& 5 0000 0101
0000 0001
任何数位的内容和0做按位与结果一定是0,任何数位的内容和1做按位与结果不变,可以使用按位与获得一个数字里某些二进制数位的内容
按位或(|)可以把两个数字对应数位的内容做或计算,只要一个数位里的内容是1则或计算以后结果就是1
3 0000 0011
| 5 0000 0101
0000 0111
任何数位内容和1做按位或结果一定是1,任何数位内容和0做按位或结果保持不变,可以用按位或把一个数字的某些二进制数位内容设置成1
按位异或可以把对应二进制数位的内容做异或计算,如果两个数位的内容一样则异或计算以后结果是0,否则结果是1
3 0000 0011
^ 5 0000 0101
0000 0110
任何数位内容和0做按位异或结果保持不变,任何数位内容和1做按位异或结果变成相反内容,使用按位异或可以把一个数字里某些二进制数位的内容变成相反内容
移位操作可以把一个数字里所有二进制数位的内容统一向左或向右移动n个位置,>>表示向右移位,<<表示向左移位,它们都是双目位操作符,操作符左边的数字是将要进行移位操作的数字,操作符的右边是移动的位数,移位操作会把每个数位的内容换一个数位放
/*
* 位操作符演示
* */
#include <stdio.h>
int main() {
unsigned int unum = 0x8fffffff;
int val = 0x8fffffff;
char ch = ~0x93;
int num = ch;
printf("num是0x%x\n", num);
printf("3 & 5是%d\n", 3 & 5);
printf("3 | 5是%d\n", 3 | 5);
printf("3 ^ 5是%d\n", 3 ^ 5);
printf("3 << 2是%d\n", 3 << 2);
printf("unum >> 2是0x%x\n", unum >> 2);
printf("val >> 2是0x%x\n", val >> 2);
val = 0x4fffffff;
printf("val >> 2是0x%x\n", val >> 2);
return 0;
}
/*
* 二进制练习
* */
#include <stdio.h>
int main() {
int num = 0;
unsigned char ch = 0x80;
printf("请输入一个数字:");
scanf("%d", &num);
printf("%d", (num & ch) != 0);
ch >>= 1;
printf("%d", (num & ch) != 0);
ch >>= 1;
printf("%d", (num & ch) != 0);
ch >>= 1;
printf("%d ", (num & ch) != 0);
ch >>= 1;
printf("%d", (num & ch) != 0);
ch >>= 1;
printf("%d", (num & ch) != 0);
ch >>= 1;
printf("%d", (num & ch) != 0);
ch >>= 1;
printf("%d\n", (num & ch) != 0);
return 0;
}
向左移位的时候右边空出来的数位里填充0
无符号类型数字右移后左边空出来的数位里一定填充0,有符号类型数字右移后左边空出来的数位里填充符号位的内容
一般情况下把数字向左移动n位相当于乘以2的n次方,向右移动n位相当于除以2的n次方
位操作符不会修改现有存储区的内容
&也可以作为单目操作符使用,这个时候它可以用来计算一个存储区的地址,这个操作符应该写在一个存储区的前面可以使用%p作为占位符把地址数据显示在终端窗口里,我们的计算机里所有地址数据都是由32个二进制数位构成的
*也可以作为单目操作符使用,这个时候它可以根据地址找到对应的存储区,使用的时候应该把这个操作符写在一个地址数据的前面
/*
* 地址数据演示
* */
#include <stdio.h>
int main() {
int num = 0;
printf("&num是%p\n", &num);
*(&num) = 10;
printf("num是%d\n", num);
return 0;
}
三目操作符可以从两种不同的计算规则里选择一个进行计算,三目操作符格式如 布尔值 ? 公式一 : 公式二,这种格式表示如果布尔值为真就采用公式一进行计算,否则采用公式二进行计算,不要在问号后使用赋值操作符
/*
* 三目表达式演示
* */
#include <stdio.h>
int main() {
int num = 0;
printf("请输入一个数字:");
scanf("%d", &num);
num = num >= 0 ? num : 0 - num;
//num >= 0 ? num = num : num = 0 - num; 错误
printf("绝对值是%d\n", num);
return 0;
}
如果一个表达式里包含多个不同类型的数字就必须首先把这些数字转换成同一个类型然后才能计算,这个转换过程叫隐式类型转换,完全由计算机执行
隐式类型转换过程中一定把占地小的类型转换成占地大的类型
如果不同类型的大小一样就把整数类型转换成浮点类型,把有符号类型转换成无符号类型
可以在C语言程序里临时给数字指定一个类型,这叫做强制类型转换,强制类型转换格式如 (char)300,强制类型转换有可能造成数据内容丢失
/*
* 类型转换演示
* */
#include <stdio.h>
int main() {
printf("sizeof(1 ? 1 : 0.9)是%d\n", sizeof(1 ? 1 : 0.9));
printf("-7 + 3 < 0是%d\n", -7 + 3 < 0);
printf("-7 + 3u < 0是%d\n", -7 + 3u < 0);
printf("%d %d\n", 300, (char)300);
return 0;
}
类型转换不会修改现有存储区的内容,计算机会用一个新的存储区记录转换后的结果
标准C语言(3)的更多相关文章
- 关于标准C语言的预定义宏【转】
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来. __LINE__ 当 ...
- 【部分原创】标准C语言的优先级、结合性、求值顺序、未定义行为和非确定行为浅析
零. 优先级 在C++ Primer一书中,对于运算符的优先级是这样描述的: Precedence specifies how the operands are grouped. It ...
- 标准SQL语言的用法
原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94 ...
- 关于标准C语言的预定义宏
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来.__LINE__ 当前 ...
- UML标准建模语言与应用实例
一.基本信息 标题:UML标准建模语言与应用实例 时间:2012 出版源:科技创新导报 领域分类:UML标准建模语言 面向对象 系统分析与设计 二.研究背景 问题定义:UML建模语言用图形来表现典型的 ...
- UML(统一建模语言)是通用的可视化标准建模语言。由构造块、公共机制、构架三部分组成。
UML UML(统一建模语言)是通用的可视化标准建模语言.由构造块.公共机制.构架三部分组成. 1.构造块:包括基本的UML建模元素(类.接口.用例等).关系(关联关系.依赖关系.泛化关系.实现关系) ...
- 标准C 语言总结
***************C语言****************** --day01-- Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用 ...
- 标准C语言(1)
C语言程序的绝大部分内容应该记录在以.c作为扩展名的文件里,这种文件叫源文件,C语言里还包含以.h作为扩展名的文件,这种文件叫做头文件 C语言程序里可以直接使用数字和加减乘除四则运算符号(*代表乘法, ...
- 【M35】让自己习惯于标准C++语言
1.最近一些年C++语言增加的特性有: a.RTTI,namespace,bool,关键字mutable和explicit,enums,以及const static int可以直接初始化. b.扩充了 ...
- 标准C语言的输入输出流(i/o)方法详解
cppreference.com -> 标准 C I/O ->详细说明 标准 C I/O clearerr 语法: #include <stdio.h> void cleare ...
随机推荐
- java读取blob,clob转换为字符串
直接上代码: package com.it.test; import java.io.BufferedReader; import java.io.StringWriter; import java. ...
- Linux下python安装升级详细步骤 | Python2 升级 Python3 转载
Linux下python升级步骤 Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如 ...
- linux环境jdk+tomcat搭建
一.什么是Linux? 和Windows操作系统软件一样,Linux也是一个操作系统软件.但是和Windows不同的是,Linux是一套开放源代码程序的.并可以自由传播的类Unix操作系统软件(Uni ...
- flower 时区设置
celery 搭配flower使用,flower默认使用的是UTC时间,那么如何在flower中使用当前城市的时间呢 我的环境 celery 3.1.25 ,python 3.69 1.在 app设置 ...
- robot-framework 利用evaluate关键字生成随机数
robot-framework 利用evaluate关键字生成随机数 最近用RF(robot-framework简称)操作MangoDB,需要直接将数据写到数据库里,又不想每次写的数据完全相同,就想到 ...
- JAVA基础--JAVA API常见对象(字符串&缓冲区)
一. String 类型 1. String类引入 第二天学习过Java中的常量: 常量的分类: 数值型常量:整数,小数(浮点数) 字符型常量:使用单引号引用的数据 字符串常量:使用双引号引用 ...
- # Tallest Cows(差分)
Tallest Cows(差分) n头牛,给出最高牛的位置和身高,其他牛身高未知,给出m对相对关系,表示可以相互看见当且仅当他们中间的牛都比他们矮.求每头牛身高最大值是多少. 差分数组的性质:前缀和为 ...
- 数据库or、in、<>、>=、<=、butween区别
操作前先关闭数据库缓存 #创建测试的test表 DROP TABLE IF EXISTS test; CREATE TABLE test( `id` ) NOT NULL, `name` ) DEFA ...
- springboot JPA mysql
官方文档 https://docs.spring.io/spring-data/jpa/docs/1.11.10.RELEASE/reference/html/ 常用关键字 通常,JPA的查询创建机制 ...
- WPF文本输入框关闭Win10输入法设置
今天一个同事突然站起来给了我一个眼神,我就知道没啥好事.果然给我指出了一些bug,其中一个是这样的,密码输入框只能输入一个字符,再输入就输入不了. 这种降档次的错误咱也能出,果断夺过键盘,疯狂输入一番 ...