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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值