Day 03

1.算术运算的注意点

  • 强制类型转换
    double a = (double)1 / 2;
    double b = (double)(1 / 2);// 错误写法,结果为0
  • 求余运算结果的正负性取决于第一个运算数,跟后面的运算数无关

2.类型转换问题

  • 2.1自动转换(隐式转换):

    • 自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。
    • 自动转换遵循以下规则:
      • 相同数据型的才能行运算(比如加法运算),而且运算果依然是同一种数据型。系会自动对占用内存少的型做一个动类型提升的操作
      • 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
      • 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转 成long型后再进行运算。
      • 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成 double型,再作运算。
      • char型和short型参与运算时,必须先转换成int型。
      • 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。
  • 2.2强制类型转换(显示转换):

  • 强制类型转换是通过类型转换运算来实现的
  • 其一般形式为:(类型说明符) (表达式)
float floatValue = 10.1f;
int sum = 4 + (int)floatValue ;
printf("sum = %d", sum);// 输出14
//  floatValue本身的值并没有改变
printf("floatValue = %f", floatValue); // 输出10.100000

3.复合赋值运算符

构成复合赋值表达式的一般形式为:
变量 双目运算符 = 表达式; 如: a *= 1 + 2;
它等效于
变量 = 变量 双目运算符 表达式; 如: a = (1 + 2) * a;

注意:赋值运算符优先级排名14位,仅仅高于“,”运算符。

4.自增、自减运算符求值过程

  • 前缀表达式:++x, --x;其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值;即先变后用,也就是变量的值先变,再用变量的值参与运算。
  • 后缀表达式:x++, x--;先用x的当前值作为表达式的值,再进行自增自减1运算。即先用后变,也就是先用变量的值参与运算,变量的值再进行自增自减变化。

5.sizeof

  • sizeof可以用来计算一个变量或一个常量、一种数据类型所占的内存字节数
  • 注意: sizeof不是一个函数, 是一个运算符. (面试题)

6.逗号运算符

表达式1,表达式2… …,表达式n;

  • 逗号表达式的运算过程是:先算表达式1,再算表达式2,依次算到表达式n
  • 整个逗号表达式的值是最后一个表达式的值

7.关系运算符优先级

  • 关系运算符中==、!=的优先级相等,<、<=、>、>=的优先级相等,且前者的优先级低于后者
  • 关系运算符的优先级小于算术运算符
    • 例如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。

8.三目运算符

  • 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。
  • 条件运算符的结合方向是从右至左
·        例如:
·        max=(a>b)? a:b;
·        可以去掉括号而写为:
·        max=a>b?a:b;
·        例如:
·        a>b?a:c>d?c:d;
·        应理解为:
·        a>b?a:(c>d?c:d)

9.产生随机数

· //如何进行随机出拳,借助一个stdlib.h下一个产生随机数的函数
· // arc4random_uniform(n) 0~n-1之间的随机的整数
#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[]) {
    
    //1.1提示用户 0代表石头; 1代表剪刀; 2代表布;
    printf("亲,0代表石头; 1代表剪刀; 2代表布;输入666退出游戏! ");
    
    //1.2设定循环让玩家可以一直玩
    while (1) {
        
        //2.0监测用户输入值的合法性
        int player = -1;
        
        while (player < 0 || player > 2) {
            //2.1如果用户输入666,则退出游戏
            if (player == 666) {
                return 0;
            }
            printf("请输入0~2中的一个数: ");
            scanf("%d", &player);
        }
        
        //3.利用电脑产生一个0~2的随机数
        int computer = arc4random_uniform(3);
        
        //4.定义一个变量储存两者之差
        int num = player - computer;
        
        //5.1如果player == computer,则平局
        if (num == 0) {
            printf("平局! ");
        }
        //5.2如果差是-1或者是2,玩家赢
        else if (num == -1 || num == 2){
            printf("我靠,你赢了! ");
        }
        //5.3否则电脑赢
        else{
            printf("很遗憾,你输了! ");
        }
        printf("player = %i, computer = %i ", player, computer);
       
    }
    
    return 0;
}

10.运算符的优先级

原文地址:https://www.cnblogs.com/wm-0818/p/5059399.html