C Primer Plus学习笔记(四)- 运算符、表达式和语句
基本运算符
赋值运算符:=
在C语言中,=不是“相等”,而是赋值运算符,把左边的值赋给右边的变量
a = 2018; //把值2018赋给变量a
赋值表达式语句的目的是把值储存到内存位置上,用于储存值的数据存储区域统称为数据对象
加法运算符:+
将其左侧的值与右侧的值相加
减号运算符:-
将其左侧的值减去右侧的值
符号运算符:-和+
-作为一元运算符,改变其右侧值的符号,一元运算符只需要一个运算对象
+作为一元运算符,不会改变运算对象的值或符号
除法运算符:/
/左侧的值是被除数,/右侧的值是除数
four = 12.0/3.0;
整数除法和浮点数除法不同。浮点数除法的结果是浮点数,整数除法的结果是整数
整数是没有小数部分的数,在C语言中,整数除法结果的小数部分会被舍弃,这称为截断
整数除法会截断计算结果的小数部分,而不是四舍五入
负整数的运算也是直接丢弃小数部分,这种方法被称为“趋零截断”
混合整数和浮点数计算的结果是浮点数
实际上,计算机不能真正用浮点数除以整数,编译器会把两个运算对象转换成相同的类型
运算优先级顺序:
运算的优先级顺序跟数学运算优先级顺序一样
其他运算符
C语言规定,sizeof返回size_t类型的值,这是一个无符号整数类型,但它不是新类型
C有一个typedef机制,允许为现有类型创建别名
typedef double real; //创建一个double的别名real
real test; //声明一个double类型的变量test
C头文件系统可以使用typeof把size_t作为unsigned int或unsigned long的别名。这样在使用size_t类型时,编译器会根据不同的系统替换标准类型
求模运算符:%
求模运算符用于整数运算
求模运算符给出其左侧整数除以右侧整数的余数
递增运算符:++
递增运算符将其运算对象递增1,该运算符有两种方式。
第一种是,++在其作用的变量前面,这是前缀模式
第二种是,++在其作用的变量后面,这是后缀模式
这两种模式递增行为发生的时间不同
x = a++; //后缀模式,使用了a的值之后才递增a
y = ++b; //递增了b的值之后才使用b的值
还有递减运算符,跟递增运算符是一样的
如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符
如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符
表达式和语句
表达式由运算符和运算对象组成,C语言中,每个表达式都有一个值,要想获得这个值,就要根据运算符优先级顺序规定的顺序来执行操作
条件表达式的值为0或1,如果条件为真,表达式的值为1;如果条件为假,表达式的值为0
语句是C程序的基本构建块,一条语句相当于一条完整的计算机指令,但不是所有的指令都是语句,例如x = 6 + (y * 5)
语句可以改变值或调用函数
在C中,大部分语句都以分号结尾
legs = 4 //只是一个表达式
legs = 4; //语句
; //只有一个分号为空语句,最简单的语句是空语句
C把末尾加上一个分号的表达式都看作是一条语句,即表达式语句,声明不是表达式语句
#include <stdio.h> int main(void)
{
int count, sum; //声明 count = 0; //表达式语句
sum = 0; //表达式语句
while (count++ < 20) //迭代语句
sum = sum + count;
printf("sum = %d\n", sum); //表达式语句 return 0; //跳转语句
}
如果删除声明后面的分号,剩下的部分不是一个表达式,也没有值
int count //不是表达式,也没有值
在C语言中,赋值和函数调用都是表达式,没有所谓的“赋值语句”和“函数调用语句”,这些语句实际上都是表达式语句
赋值表达式语句在程序中很常用,它为变量分配一个值
赋值表达式语句的结构是,一个变量名,后面是一个赋值运算符,再跟着一个表达式,最后以分号结尾
函数表达式语句会引起函数调用
副作用和序列点
副作用是对数据对象或文件的修改,使用一条语句的主要目的就是使用其副作用
例如,调用printf()函数时,它显示的信息其实是副作用
序列点是程序执行的点,在该点上,所有的副作用都在进入下一步之前发生
在C语言中,语句中的分号标记了一个序列点
在一条语句中,赋值运算符、递增运算符和递减运算符对运算对象做的改变必须在程序执行下一条语句前完成
任何一个完整表达式的结束也是一个序列点
完整表达式就是指这个表达式不是另一个更大表达式的子表达式
复合语句(块)
复合语句是用花括号括起来的一条或多条语句,复合语句也称为块
#include <stdio.h> int main(void)
{
int count = 0;
int sum = 0; while (count++ < 10)
sum = 10 * count +2;
printf("sum = %d\n", sum);
}
while循环中只有一条赋值表达式语句,没有花括号,while语句从while这行运行到下一个分号。循环结束后,才执行printf()函数
运行结果
#include <stdio.h> int main(void)
{
int count = 0;
int sum = 0; while (count++ < 10)
{
sum = 10 * count +2;
printf("sum = %d\n", sum);
}
}
花括号确保两条语句都是while循环的一部分,每执行一次循环就调用一次printf()函数
根据while语句的结构,整个复合语句被视为一条语句
运行结果
类型转换
当类型转换出现在表达式时,无论是unsigned还是signed的char和short都会被自动转换成int,如有必要会被转换成unsigned int(如果short和int的大小相同,unsigned short就比int大,这种情况下,unsigned short会被转换成unsigned int),从较小类型转换成较大类型,这些转换被称为升级
涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别
类型的级别从高到低依次是long double、float、unsigned long long、long long、unsigned long、long、unsigned int、int。例外的情况是,当long和int的大小相同时,unsigned int比long的级别高。short和char类型会被升级到int或unsigned int
在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。这个过程可能导致类型升级或降级。降级就是把一种类型转换成更低级别的类型
当作为函数参数传递时,char和short被转换成int,float被转换成double
类型升级通常都不会有什么问题,但是类型降级会导致一些麻烦,因为较低类型可能放不下整个数字
如果待转换的值是否与目标类型匹配,这取决于转换涉及的类型,待赋值的值与目标类型不匹配时,规则如下:
1.目标类型是无符号整型,且待赋的值是整数时,额外的位将被忽略
2.如果目标类型是有一个有符号整型,且待赋的值是整数,结果因实现而异
3.如果目标类型是一个整型,且待赋的值是浮点数,该行为是未定义的
如果把一个浮点数转换成整数,小数部分会被截断
强制类型转换运算符
通常,应该避免自动类型转换,尤其是类型降级
强制类型转换,即在某个量的前面放置用圆括号括起来的类型名,该类型名即是希望转换成的目标类型
圆括号和它括起来的类型名构成了强制类型转换运算符
int mice; //定义一个int类型的变量mice
mice = 1.6 + 1.7; //自动类型转换,1.6+1.7的结果3.3被截断为整数3
mice = int(1.6) + int(1.7); //1.6和1.7在相加之前被转换成整型(1),把1+1的结果赋给mice
本质上,两种类型转换都好不到哪去,要考虑程序的具体情况再做取舍
带参数的函数
看一个打印指定数量的#号的小程序
#include <stdio.h> void pound(int n); //ANSI函数原型声明
int main(void)
{
int times = 5;
char ch = '!';
float f = 6.0f; pound(times); //int类型的参数
pound(ch); //和pound((int)ch);相同
pound(f); //和pound((int)ch);相同 return 0;
} void pound(int n) //表示该函数接受一个int类型的参数
{
while (n-- > 0)
printf("#");
printf("\n");
}
运行结果
void pound(int n),如果函数不接受任何参数,函数头的圆括号中应该写上关键字void。由于该函数接受一个int类型的参数,所以圆括号中包含一个int类型变量n的声明
声明参数就创建了被称为形式参数(形参)的变量
函数调用传递的值为实际参数,简称实参
形参是变量,实参是函数调用提供的值,实参被赋给相应的形参
函数的原型即是函数的声明,描述了函数的返回值和参数,所以变量ch和f都被转换成int类型
函数名前面有void关键字,该函数没有返回值
C Primer Plus学习笔记(四)- 运算符、表达式和语句的更多相关文章
- (C/C++学习笔记) 四. 运算符
四. 运算符 运算符优先级和结合性 Operator precedence and associativity (or fixity) 注意: ① 成员运算符MemberOperators可以称为点运 ...
- Java学习笔记四——运算符
算术运算符 加减乘除(+.-.*./)就不说了. 求余运算符% 描述:第一个操作数除以第二个操作数,得到一个整除的结果后剩下的值就是余数 注意:求余预算的结果不一定总是整数,当操作数是浮点数时,结果可 ...
- python学习笔记8(表达式和语句)
一.print 和 import 信息 >>> print 'age:',22 # 用逗号隔开打印多个表达式 age: 22 import somemodule # 从模块导入函数 ...
- Go语言学习笔记四: 运算符
Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...
- python3.4学习笔记(四) 3.x和2.x的区别,持续更新
python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- java学习笔记06--正则表达式
java学习笔记06--正则表达式 正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证.拆分.替换等操作. 例如:现在要去判断一个字符串是否由数字组成,则可以有以下的两种做法 不使用正则 ...
随机推荐
- CSDN_帖子__WapPc
CSDN的帖子,Wap版 和 PC版 网址对应关系: 1. 举个例子: 手机版的网址: http://bbs.csdn.net/wap/topics/391891319 PC版的网址: http:// ...
- FreeTDS-SQL Server在linux和unix下的免费驱动
微软为MS SQL Server的连接和使用提供了很好的 驱动和 文档. 不幸的是,那只能在windows操作系统上使用. 所以对于Linux或者Unix,您需要寻找不同的方法来连接MS SQL Se ...
- js组合模式
组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 透明方式,也就是说在Commponent中声明所有用来管理子 ...
- gbk编码汉字转换成对应的十进制十六进制的值
http://www.mytju.com/classcode/tools/urlencode_gb2312.asp
- npm、模块暴露,小知识点区别
--save-dev与--save的区别 npm install xxx --save-dev 是指将包信息添加到 package.json 里的 devDependencies节点,表示开发时依赖的 ...
- windows7安装PyQt5(通过pip install 安装)
开始接触PyQt5 ,总结了一下安装的方法 默认各位已经安装好了Python环境 首先,确定一下之前没有安装过pyqt5,如果安装了,可以先卸载,避免出现意外, 之前装了几次没成功就是这种情况,卸载命 ...
- LeetCode OJ:Subsets(子集)
Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...
- 整理下PC和移动获取点击、移动坐标的代码和坑
一.PC PC是通过鼠标点击和移动,相对比较简单,比如onmousedown.onmouseup.onmousemove.onmouseout鼠标按键按下.按键起来.鼠标在元素上移动.鼠标从元素上离开 ...
- 烂泥Linux学习笔记
把最近学习过程中所写的文章整理了下:注意:本帖会持续性更新!!! 虚拟化篇:<烂泥:虚拟化KVM安装与配置><烂泥:KVM安装centos6.5系统><烂泥:KVM中安装 ...
- javascript版前端页面RSA非对称加密解密
最近由于项目需要做一个url传参,并在页面显示参数内容的需求,这样就会遇到一个url地址可能会被假冒, 并传递非法内容显示在页面的尴尬情况 比如xxx.shtml?server=xxx是坏人& ...