一、运算符
在高级语言中,运算是必不可少的,既然有运算,运算符那是不言而喻的,必须要有。所有总结一句话:运算符是告诉编译程序执行特定算术或逻辑操作的符号。
二、C语言中的运算符分类
按照功能划分:
算术运算符
关系运算符与逻辑运算符
按位运算符
运算符根据参与运算的操作数的个数分为
单目运算
单目运算:只有一个操作数 如 : i++ ! sizeof
双目运算
双目运算:有两个操作数 如 : a+b
三目运算
三目预算:C语言中唯一的一个,也称为问号表达式 a>b ? 1 : 0
在iOS开发中,算数运算,单目用算,双目运算,三目运算是最常用的运算。
三、运算符号的排辈
生活中有长辈之分,在软件开发中,也有优先级之分。
C语言中,运算符的运算优先级共分为15 级。1 级最高,15 级最低。 在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的 结合性所规定的结合方向处理。
在iOS开发中,记住一个点:()。括号的优先级最高,遇到这个符号,他就是老大。
四、算数运算符号
“+ - * / %” 。加,减,乘,除,求余,都是算术运算符。
求余运算的注意事项:
参与运算的必须是整数
10 % 2 = 0
因为 10 可以被2整除, 没有余数
10 % 3 = 1
因为 10除以3余1, 所以结果为1
错误写法
12.3 % 3
注意
m%n 求余,相当于m/n 获取余数
(1)n等于0 无意义
(2)m等于0 结果为0
(3)m>n 正常求余 如:8 % 3 = 2
(4)m
int a = 10.6;
int b = 10.5 + 1.7;
1
2
(7)自动将大类型转换为了小类型,会丢失精度自动类型提升
int b = 10.5 + 10;
(8)将右边的1提升为了double类型
double b = 1.0 / 2;
解决除法的精度问题
(9).强制类型转换
double a = (double)1 / 2;
double b = (double)(1 / 2);// 错误写法
六、赋值运算符
+ 简单赋值运算符: =
+ 复合赋值运算符: +=、-=、*=、/=、%=
赋值表达式
由“=”连接的式子称为赋值表达式。
例如: x = a + b;
等号=左边只能是变量,不能是常量,下面的写法是错误的:10 = 10 + 5;
注意:凡是表达式可以出现的地方均可出现赋值表达式
赋值运算符的结合性
赋值运算符具有右结合性, 而且优先级比算术运算符低
例如: int a = 3 + 5; 会先计算3 + 5, 然后再把结果赋值给a
例如: int a = b = c = 5; 右结合性可理解为a=(b=(c=5))
七、赋值运算的高级式-复合赋值运算符
在赋值符“=”之前加上其它二目运算符可构成复合赋值符。
/= 除后赋值 变量/=表达式 如:a/=3;即a=a/3
= 乘后赋值 变量=表达式 如:a*=3;即a=a*3
%= 取模后赋值 变量%=表达式 如:a%=3;即a=a%3
+= 加后赋值 变量+=表达式 如:a+=3;即a=a+3
-= 减后赋值 变量-=表达式 如:a-=3;即a=a-3
构成复合赋值表达式的一般形式为:
变量 双目运算符 = 表达式; 如: a *= 1 + 2;
它等效于
变量 = 变量 双目运算符 表达式; 如: a = (1 + 2) * a;
注意:赋值运算符优先级排名14位,仅仅高于“,”运算符。
八、自增运算符
前缀表达式:++x, –x;其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值;即“先变后用”,也就是变量的值先变,再用变量的值参与运算。
后缀表达式:x++, x–;先用x的当前值作为表达式的值,再进行自增自减1运算。即“先用后变”,也就是先用变量的值参与运算,变量的值再进行自增自减变化。
自增,自减注意点:
自增、自减运算只能用于单个变量,只要是标准类型的变量,不管是整型、实型,还是字符型变量等,但不能用于表达式或常量。如:++(a+b), 与5++, const int N=0; N++; 等都是错误 的。
而i+++j++、++i+(++j)、++a+b++、++array[–j]等,这些都是合法的。
九、sizeof运算符及用法
sizeof可以用来计算一个变量或一个常量、一种数据类型所占的内存字节数
格式: 用法:sizeof(常量/变量)
注意: sizeof不是一个函数, 是一个运算符. (面试题)
sizeof( 变量\常量 )
sizeof(10);
char c = ‘a’; sizeof(c);
sizeof 变量\常量
sizeof 10;
char c = ‘a’; sizeof c;
sizeof( 数据类型 )
sizeof(float);
注意:如果是数据类型不能省略括号
sizeof float; // 错误写法
十、逗号运算符
在C语言中逗号“,”也是一种运算符,称为逗号运算符。
功能是把多个表达式连接起来组成一个表达式,称为逗号表达式。
一般形式形式: 表达式1,表达式2,… …,表达式n;
例如: a=a+1,b=3*4;
在iOS开发中,逗号经常做分隔符号,做运算符号的意义不大。
理解下面一段逗号运算符的运算,
b = (a=4, ++a, a * 7);
// 1.先执行第一个表达式, 将4赋值给a
// 2.再执行第二个表达式, 让a自增变为5
// 3.再执行第三个表达式, 5 * 7
// 4.最后将最后一个表达式的值作为”逗号表达式的值”返回赋值给b, 所以b等于35
使用逗号运算的注意事项:
(1) 程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。
(2) 并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用 作各变量之间的间隔符。
十一、关系运算符
默认情况下,我们在程序中写的每一句正确代码都会被执行。但很多时候,我们想在某个条件成立的情况下才执行某一段代码
这种情况的话可以使用条件语句来完成。
关系运算符的运算结果只有2种:如果条件成立,结果就为1,也就是“真”;如果条件不成立,结果就为0,也就是“假”。
这里写图片描述
十二、关系运算符优先级和结合性
关系运算符中==、!=的优先级相等,<、<=、>、>=的优先级相等,且前者的优先级低于后者
例如2==3>1:先算3>1,条件成立,结果为1。再计算2==1,条件不成立,结果为0。因此2==3>1的结果为0。
关系运算符的优先级小于算术运算符
例如3+4>8-2:先计算3+4,结果为7。再计算8-2,结果为6。最后计算7>6,条件成立,结果为1。因此3+4>8-2的结果为1。
十三、逻辑运算符
C语言中提供了三种逻辑运算符:
&&(与运算)
||(或运算)
!(非运算)
逻辑运算的结果只有2个:“真”为1,“假”为0
1.逻辑与
格式:
“条件A && 条件B”
运算结果:
只有当条件A和条件B都成立时,结果才为1,也就是“真”;其余情况的结果都为0,也就是“假”。因此,条件A或条件B只要有一个不成立,结果都为0,也就是“假”
口诀:一假则假
在iOS开发中会经常用到,尤其是在UI中判断几个控件中的值是否同时成立的条件。
- 逻辑与使用注意:*
C语言规定:任何非0值都为“真”,只有0才为“假”。因此逻辑与也适用于数值。比如 5 && 4的结果是1,为“真”;-6 && 0的结果是0,为“假”
2.逻辑或
格式:
“条件A||条件B”
运算结果:
当条件A或条件两个都不成立时,结果才为0,也就是“假”;其余情况的结果都为1,也就是“真”。因此,条件A和条件B两个东莞不成立,结果为零,也就是“假”,其他的都为真。
口诀:同假为假,其余为真
- 逻辑或使用注意:*
C语言规定:任何非0值都为“真”,只有0才为“假”。因此逻辑或也适用于数值。比如 5 || 4的结果是1,为“真”;-6 || 0的结果是1,为“真”;0 || 0的结果是0,为“假”
3.逻辑非
格式:
“! 条件A”
运算结果:
其实就是对条件A进行取反:若条件A成立,结果就为0,即“假”;若条件A不成立,结果就为1,即“真”。也就是说:真的变假,假的变真。
口诀:真变假,假变真
- 逻辑非使用注意:*
可以多次连续使用逻辑非运算符:!(4>2)结果为0,是“假”,!!(4>2)结果为1,是“真”,!!!(4>2)结果为0,是“假”。
C语言规定:任何非0值都为“真”,只有0才为“假”。
因此,对非0值进行逻辑非!运算的结果都是0,对0值进行逻辑非!运算的结果为1。
!5、!6.7、!-9的结果都为0,!0的结果为1
十四、逻辑运算符结合性和优先级
!(非) // 注意
↑
算术运算符
↑
关系运算符
↑
&&和|| // 注意
↑
赋值运算符
1.逻辑非优先级
int result = !0 + 1;
printf(“result = %d”, result);
输出结果: 2
先计算!0等于1
然后再用计算结果加上1
2.算术运算符与逻辑运算符优先级
int result = 3 + 3 && 0 + 1;
// (3 + 3) && (0 + 1);
printf(“result = %d”, result);
输出结果: 1
先计算3+3和0+1等到6和1
然后6&&1
3.关系运算符与逻辑运算符优先级
int result = 3>5 || 2<4 && 6<1;
// (3>5) || (2<4) && (6<1)
// 0 || 1 && 0
// 1 && 0
printf(“result = %d”, result);
输出结果: 0
先计算3>5,2<4,6<1得到结果0,1,0
再进行逻辑运算0||1得到结果1
再进行逻辑运算1&&0得到结果0
4、与或的短路问题
(1)与短路:&& 只要第一个条件表达为假那么后面的条件表达就不参与运算了
int a = 10;
int b = 20;
int result = (a > 19) && (b++ > 6);
printf("a = %d,b = %d, result = %d\n", a, b, result);
输出结果:a = 10,b = 20, result = 0
(2)或短路:|| 只要第一个条件表达式为真那么后面的条件表达式就不参与运算了
int a = 10;
int b = 20;
int result = (a > 19) || (b++ > 6);
printf("a = %d,b = %d, result = %d\n", a, b, result);
输出结果:a = 10,b = 21, result = 1
十五、三目运算
条件运算符是C语言的唯一的三目运算符,即它需要3个数据或表达式构成条件表达式
格式:
表达式1?表达式2(结果A):表达式3(结果B)
求值规则:
如果表达式1为真,三目运算符的运算结果为表达式2的值(结果A),否则为表达式3的值(结果B)
温馨提示:由于三目运算的可读性不高,在iOS开发中尽量少使用三目运算,避免未知错误。
三目运算的示例:
int a = 10;
int b = 20;
int max = (a > b) ? a : b;
printf("max = %d", max);
输出结果: 20
等价于:
int a = 10;
int b = 20;
int max = 0;
if(a>b){
max=a;
}else {
max=b;
}
printf("max = %d", max);
三目运算的注意事项
(1) 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。
例如:
max=(a>b)? a:b;
可以去掉括号而写为:
max=a>b?a:b;
条件运算符?和:是一对运算符,不能分开单独使用。
(2) 条件运算符的结合方向是从右至左
例如:
a>b?a:c>d?c:d;
应理解为:
a>b?a:(c>d?c:d)
十六、流程控制
程序的运行流程是这样的:运行程序后,系统会按书写从上至下顺序执行程序中的每一行代码,但是这并不能满足我们所有的开发需求,为了方便我们控制程序的运行流程,C语言提供3种流程结构,不同的流程结构可以实现不同的运行流程。
在iOS开发中,流程控制是非常常用的。
这3种流程结构分别是:顺序、选择、循环三种基本控制结构构造.
1.选择结构-if
(1) 表示如果表达式为真,执行语句块1,否则不执行。
if(表达式)
{
语句块1
}
后续语句;
示例:
if(age > 18)
{
printf("你已经成年了!");
}
(2) 当条件表达式为真的时候会执行if后面的第一条语句
注意点:在以后iOS开发中尽量不要写使用该格式
if (条件表达式)
语句1;
示例:
if(age > 18)
printf("开网卡");
(3) 如果表达式为真,则执行语句块1,否则执行语句块2
if(表达式)
{
语句块1
}else{
语句块2
}
后续语句;
示例:
if(age > 18)
{
printf("开网卡");
}else{
printf("未成年禁止进网吧");
}
(4) 如果表达式1为真,则执行语句块1,否则判断表达式2,如果为真执行语句块2,否则再判断 表达式3,如果真执行语句块3, 当表达式1、2、3都不满足,会执行最后一个else语句。
if(表达式1)
{
语句块1
}else if(表达式2){
语句块2
}else if(表达式3){
语句块3
}else{
语句块4
}
后续语句;
示例:
if(age>18)
{
printf("给网卡");
}else if(age>25){
printf("给名片");
}else if(age>40){
printf("给房卡");
}else{
printf("给好人卡");
}
特点:
1.这么多大括号中只有一个大括号中的内容会被执行
2.当执行到后面条件的时候证明前面的条件不满足了
(5) if嵌套
if语句可以嵌套使用
示例:
int num = 8;
if (num > 5)
{
if(num<10)
{
printf("一个5~10之间的数")
}
}
选择结构-if练习题
1.判断奇偶数
从键盘输入一个整数,判断其是否是偶数,如果是偶数就输出YES,否则输出NO;
#include <stdio.h>
int main (){
// 1.提示输入信息
printf("输入一个整数\n");
// 2.接收输入信息
int value;
scanf("%d", &value);
// 3.判断是否能被2整除
if (value%2 == 0) {
// 输出偶数
printf("yes");
}else{
printf("no");
}
}
2.输出对应星期
接收用户输入的1~7的整数,根据用户输入的整数,输出对应的星期几
#include <stdio.h>
int main (){
// 1.提示用户输入星期几
printf("请输入星期几(1~7)\n");
// 2.接收用户输入的星期数
int day;
scanf("%d",&day);
// 3.输出对应的星期
// --》1.用屌丝做法 每天一个if
// --》2.用高帅富做法 if else if
if(day == 1)
{
printf("星期1\n");
}
else if(day == 2)
{
printf("星期2\n");
}
else{
printf("地球不属于你\n");
}
}
3.输出对应季节
接收用户输入的一个整数month代表月份,根据月份输出对应的季节
#include <stdio.h>
int main (){
// 1.提示用户输入月份
printf("请输入月份(\n");
// 2.接收用户输入的星期数
int month;
scanf("%d",&month);
// 3.输出对应的月份
if (month >=3 && month <=5) {
printf("春季\n");
}else if (month >=6 && month <=8)
{
printf("夏季\n");
}else if (month >=9 && month <=11)
{
printf("秋季\n");
}else if(month == 12 || month == 1 || month == 2)
{
printf("春季\n");
}else
{
printf("地球不属于你\n");
}
if(month >12 || month <1){
printf("地球不属于你\n");
}
else if(month >=3 && month <=5)
{
printf("春季\n");
}
else if(month >=6 && month <=8)
{
printf("夏季\n");
}
else if(month >=9 && month <=11)
{
printf("秋季\n");
}
else
{
printf("冬季\n");
}
4.排序
从键盘输入3个整数,排序后输出
方式1
#include <stdio.h>
int main (){
int a, b, c;
printf("输入3个整数并用逗号隔开\n");
scanf("%d,%d,%d", &a, &b, &c);
// 方式1 写出所有方式
if (a >= b && b >=c) {
printf("%d > %d > %d\n", a, b, c);
}else if (a >= c && c >= b) {
printf("%d > %d > %d\n", a, c, b);
}else if (b >= a && a >= c) {
printf("%d > %d > %d\n", b, a, c);
}else if (b >= c && c >= a) {
printf("%d > %d > %d\n", b, c, a);
}else if (c >= a && a >= b) {
printf("%d > %d > %d\n", c, a, b);
}else if (c >= b && b >= a) {
printf("%d > %d > %d\n", c, b, a);
}
}
//方式2
#iclude <stdio.h>
int main(){
int a, b, c;
printf("输入3个整数并用逗号隔开\n");
scanf("%d,%d,%d", &a, &b, &c);
// 方式2(选择排序,画图讲解)
int temp;
if (a < b) {
temp = a;
a = b;
b = temp;
}
if (a < c) {
temp = a;
a = c;
c = temp;
}
if ( b < c) {
temp = b;
b = c;
c = temp;
}
printf("%d > %d > %d\n", a, b, c);
return 0;
}
选择结构-if注意点
1.if语句的使用注意点
“;” 空语句
if(条件) 可以直接写分号 “;” 表示什么也不干
if(10 > 2);
{
printf(“10 > 2”);
}
输出结果: 10 > 2
任何数值都有真假性
if(1)、if(-1) 表示永真 if(0) 表示为永假
if (0) {
printf("123\n");
}
判断变量与常量问题
但凡遇到比较一个变量等于或者不等于某一个常量的时候,把常量写在前面
// if(a = 0) // 错误写法, 但不会报错
if (0 == a) {
printf("a的值是0\n");
}else{
printf("a的值不是0\n");
}
变量作用域问题
if (age > 10) {
printf("已经懂事了\n");
int num = 1000;
}
printf("num = %d\n",num);
作用域混乱
想在if后面定义变量必须写{}
if (0)
int a = 10; // 这句会报错
printf("a = %d\n", a);
省略大括号问题
if else是一个整体, else匹配if的时候匹配离它最近的一个if
if(0)
if(1)
printf("A\n");
else
printf("B\n");
else
if (1)
printf("C\n");
else
printf("D\n");
十七、用所学到的流程控制完成简单的剪刀石头布的游戏实现
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
// 定义 0.剪刀 1.石头 2.布
// 1、定义变量 玩家和电脑
int player,computer=0;
// 2、让电脑先出拳
//随机出拳
//如何进行随机出拳,借助一个stdlib.h下一个产生随机数的函数
// arc4random_uniform(n) 0~n-1之间的随机的整数
computer = arc4random_uniform(3); //0 1 2
//printf("%d\n",computer);
// 3、用户出拳
printf("请出拳:0.剪刀 1.石头 2.布\n");
scanf("%d",&player);
// 数据合法性的校验
if (player<0||player>2) {
printf("非法的输入");
return 0;
}
// 4、判断比较 //先判断用户赢的情况
if((player==0&&computer==2)||
(player==1&&computer==0)||
(player==2&&computer==1)){
printf("我靠,你赢了!\n");
}else if((computer==0&&player==2)||
(computer==1&&player==0)||
(computer==2&&player==1)){
printf("很遗憾,你输了!\n");
}else{
printf("平局\n");
}
return 0;
}
版权声明:本文为博主原创文章,为了能相互促进,相互学习,请关注新浪微博:极客James