iOS开发分分钟搞定C语言——运算符

来源:互联网 发布:小猪cms伪静态 编辑:程序博客网 时间:2024/05/15 23:50

一、运算符
在高级语言中,运算是必不可少的,既然有运算,运算符那是不言而喻的,必须要有。所有总结一句话:运算符是告诉编译程序执行特定算术或逻辑操作的符号。

二、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;

(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");elseif (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;}
0 0
原创粉丝点击