zoukankan      html  css  js  c++  java
  • php : 基础(3)

    运算符

    算术运算符

    基础:

    符号有:+   -   *   /   %

    说明:

    1. 他们都是针对数字进行的运算;
    2. 如果他们的两边有不是数字的数据,就会(自动)转换为数字;
    3. 其中取余运算(取模运算)%,它只针对“整数”进行运算,如果不是,会自动截取为整数。
        1. 3 % 3 相当于 11 % 3;
      • 11.8 % 3. 8 相当于 11 % 3;

    自增自减运算符:

    • 常规:对数字进行自加1或自减1。
    • 字符串: 只能自增,且自增的效果就是“下一个字符”,其只能针对字母或数字进行自加:
    • 布尔值递增递减无效
    • null递减无效,递增结果为1

    字符串自增的例子:

    前自增和后自增的区别(自减类似)

    通常,我们在循环中,推荐使用前加加(效率稍高),比如:
    for($i = 1; $i < 10000; ++$i){ ....... }

    演示前加加后加加进行1千万次的“效率比较”:

    比较运算符

    • 符号:>   >=   <   <=   ==   !=   =   !
    • 一般比较:是针对数字进行的大小比较
    • =比较:前者通常叫做模糊相等的比较,后者叫做精确相等的比较(只有数据的类型和数据的值/内容,都相等,才是全等的)。
    • 不要对浮点数直接进行大小比较

    必须能够找到手册的“类型比较表”:附录》php类型比较表:

    常见不同类型(标量类型)数据之间的比较规律:

    • 如果比较的数据中,有布尔值,转为布尔值比较,布尔值比较只有一个规则:true>false
    • 否则,如果有数字值,就转为数字值比较:这就是常规比较。
    • 否则,如果两边都是“纯数字字符串”,转为数字比较
    • 否则,就按字符串比较。字符串比较的规则是:
      • 对两边的字符串,一个一个从前往后取出字符并进行比较,谁“先大”,结果就是它大。
    “abc” > true  //? false
    “abc” > false  //true
    “0”  > false  //false
    3  >  “12”;       //false
    3  >  “12abc”; //false
    “3”  > “12”   //false
    “abc”  > “c”;  //false,后者大
    “abc”  > “ab123cde”; //true  因为这里”c”大于”1”
    “3abc” > “12abc”;           //true, 因为”3”大于“1”
    1 > “a”;                             //? true
    “1” > “a”                          //? false
    

    逻辑运算符

    • 逻辑运算符都是针对“布尔值”进行的运算。
    • 如果不是布尔值,就会转换为布尔值进行;
    • 布尔值只有2个:true,false

    基本运算规则(真值表):

    • 逻辑与规则:

      • true && true ==>> true
      • true && false ==>>false
      • false && true ==>>false
      • false && false ==>>false
      • 总结:只有2个都是true,结果才是true

        只要有一个是false,结果就是false
    • 逻辑或规则:

      • true || true ==>> true
      • true || false ==>>true
      • false || true ==>>true
      • false || false ==>>false
      • 总结:只有2个都是false,结果才是false

        只要有一个是true,结果就是true
    • 逻辑非规则:

      • !true ==>> false
      • !false ==>> true

    辑运算符的“短路现象”:

    • 逻辑与短路:

    结果:如果一个语句中,通过与运算需要进行多项判断,而且不同的判断具有明显不同的“复杂程度”,则我们应该将简单的判断放在前面,这时候我们就可以利用短路现象以达到提高效率的目的。

    • 逻辑或短路:

    结果:如果一个语句中,通过或运算需要进行多项判断,而且不同的判断具有明显不同的“复杂程度”,则我们应该将简单的判断放在前面,这时候我们就可以利用短路现象以达到提高效率的目的。

    字符串运算符

    1. 符号只有一个: .  也衍生出另一个: .=
    2. 含义:就是将这个符号两边的字符串连接起来;
    3. 如果两边不是字符串,就会自动转换为字符串,然后连接起来。
    “ab”  .   3                  ==>> “ab3”;
    “12”  .   3                ==>>”123”
    12  .  3         ==>> “123”
    

    赋值运算符:

    • 一个基本赋值运算符: =
      • 形式: $变量名 = 值;
      • 理解: 将右边的值(不管做了多少运算),赋值给左边的变量。
    • 若干个衍生的赋值运算符:
      • += 加等: 形式: $变量名 += 值;
        • 理解: 相当于: $变量名 = $变量名 + 值;
      • -= 加等: 形式: $变量名 -= 值;
        • 理解: 相当于: $变量名 = $变量名 - 值;
      • *=  /=  %=  .=  其都可以认为是上述形式的一种简化版。

    条件(三目,三元)运算符

    • 只有一个,形式如下:

      • 数据值1 ? 数据值2 : 数据值3
    • 含义:

      • 对数据值1进行判断,如果为“真”,则该运算符的运算结果就是数据值2,否则就是数据值3;
    • 它是这样一个流程控制(逻辑判断)语句的简写形式:

    if( 数据值1 ){
    $变量名 = 数据值2;
    }
    else{
    $变量名 = 数据值3;
    }
    

    注意:如果数据值1不是布尔值,也会转换为布尔值;

    $score = 66;                    //分数
    $valuation = $score >= 60 ?  “及格”  :  “不及格”;           //结果为“及格”
    
    $score = 56;                    //分数
    $valuation = $score >= 60 ?  “及格”  :  “不及格”;           //结果为“不及格”
    
    $score = 56;                    //分数
    $valuation =  $score  ?  “及格”  :  “不及格”;    //结果为“及格”,这里可能就偏离的本意!!
    

    位运算符

    基础规定

    1. 位是什么?就是2进制数字的每一个“位”,一个整数数字,有(由)32个位构成!
    2. 位运算符是仅仅针对整数进行的运算符;
    3. 位运算符有如下几个
      • &: 按位与;
      • |: 按位或;
      • ~: 按位非;按位取反;
      • ^: 按位异或;
    4. 位运算符的基本语法规则:
    • 按位与基本规则:

      • 1 & 1 ==>> 1
      • 1 & 0 ==>> 0
      • 0 & 1 ==>> 0
      • 0 & 0 ==>> 0
    • 按位或基本规则:

      • 1 | 1 ==>> 1
      • 1 | 0 ==>> 1
      • 0 | 1 ==>> 1
      • 0 | 0 ==>> 0
    • 按位非基本规则:

      • ~1 ==>> 0
      • ~0 ==>> 1
    • 按位异或基本规则:

      • 1 ^ 1 ==>> 0
      • 1 ^ 0 ==>> 1
      • 0 ^ 1 ==>> 1
      • 0 ^ 0 ==>> 0
        • 可见,按位异或的规则是:相同为0,不同为1

    整数的按位与运算(&)

    • 形式:
      • $n1 & $n2; //n1,n2是2个任意整数;
    • 含义:
      • 将该2个整数的二进制数字形式(注意,都是32位)的每一个对应位上的数字进行基本按位与运算之后的结果!
    • 注意:他们运算的结果,其实仍然是一个普通的数字(10进制)。

    示例图示(只用8个位来演示):

    $r1 = 10 & 20;

    102进制

    0

    0

    0

    0

    1

    0

    1

    0

    202进制

    0

    0

    0

    1

    0

    1

    0

    0

    &运算结果:

    0

    0

    0

    0

    0

    0

    0

    0

    代码验证:

    整数的按位或运算:

    • 形式:
      • $n1 | $n2; //n1,n2是2个任意整数;
    • 含义:
      • 将该2个整数的二进制数字形式(注意,都是32位)的每一个对应位上的数字进行基本按位或运算之后的结果!
    • 注意:他们运算的结果,其实仍然是一个普通的数字(10进制)。

    示例图示(只用8个位来演示):

    $r1 = 10 | 20;

    102进制

    0

    0

    0

    0

    1

    0

    1

    0

    202进制

    0

    0

    0

    1

    0

    1

    0

    0

    |运算结果:

    0

    0

    0

    1

    1

    1

    1

    0

    则结果该数据值大小为: 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 1 * 2^1 + 0 = 16 + 8 + 4 + 2 = 30

    代码验证:

    整数的按位左移运算

    • 形式:
      • $n1 << $m
    • 含义:
      • 将十进制数字n1的二进制数字形式(也是32位的)的每一个位上的数字都一次性往左边移动m位,

        并将右边空出来的位置补0,左边冒出去的不管,这样操作之后得到的结果。

    示例图示(只用8个位来演示):

    $r1 = 10 << 2;

    102进制

    0

    0

    0

    0

    1

    0

    1

    0

    左移2位后

    0

    0

    1

    0

    1

    0

    0

    0

    则结果为:

     

     

    25

    0

    23

    0

    0

    0

    可见,结果为:25 + 23 = 32 + 8 = 40

    代码验证:

    补充知识:原码,反码,补码

    • 原码:

      • 就是一个二进制数字,从“数学观念”上来表达出的形式。其中,我们规定:
      • 一个数字的最左边一位是“符号位”,0表示正数,1表示负数;

      比如:

    • 反码:

      • 正数的反码就是其本身(即不变);
      • 负数的反码是:符号位不变,其他位取反;

      比如:

    • 补码:

      • 正数的补码就是其本身(即不变);
      • 负数的补码是:符号位不变,其他位取反后+1——即反码+1

      比如:

    一个小提示:计算机内部的运算,实际全都是使用补码进行的,而且运算的时候,符号位不再区分,直接也当做“数据”参与运算:

    • 示例1: 5+3<

    • 示例2: 5-3:

      • 实际上,cpu内部,会将“减法”运算,转换为“加法运算”,即:5 + (-3)

    位运算符的应用:管理一组事物的开关状态

    • 什么是开关状态?

      • 现实中,有很多数据都是只有2种结果(值)的,对应的其实就是我们的布尔类型的值。
      • 这里,所谓管理一组事物的开关状态,应该理解为其实就是管理若干个只有2个状态的“数据符号”。
      • 比如:有5个灯泡,对应5个状态数据。
      • 这5个灯泡,就有 25 种状态呢?
    • 这里的管理目标是:使用一个变量,就可以表达若干个数据的“当前状态”。具体有3个任务:

      1. 通过该变量,可以获知任何一个数据(灯泡)的当前状态。
      2. 通过该变量,可以将一个一个数据的状态“关闭”;
      3. 通过该变量,可以将一个一个数据的状态“开启”;

    数组运算符

    有这些:

    • +: 数组联合,也可以理解为“数组串联”。

    将右边的数组项合并到左边数组的后面,得到一个新数组。如有重复键,则结果以左边的为准

    $arr1 = array(5=>10,  8=>20,  10=>30);
    $arr2 = array(3=>33,  2=>22);
    $r1 = $arr1 + $arr2;      //结果为:array(5=>10,  8=>20,  10=>30, 3=>33,  2=>22)
    另一个有重复键的例子:
    $arr1 = array(5=>10,  8=>20,  10=>30);
    $arr2 = array(8=>33,  2=>22);
    $r1 = $arr1 + $arr2;      //结果为:array(5=>10,  8=>20,  10=>30, 2=>22)
    
    • ==

    如果两个数组具有相同的键名和键值(可以顺序不同,或类型不同),则返回true

    $arr1 = array(3=>33,  2=>22);
    $arr2 = array(2=>”22”, 3=>”33” );
    此时,$arr1,和 $arr2是相等的( = = )
    
    • !=
    • ===: 如果两个数组具有相同的键名和键值且顺序和类型都一样,则返回true
    • != =

    错误控制运算符@:

    通常就用在一个地方:

    $link  =  @mysql_connect(“数据库服务器地址”, “用户名”,  “密码”);
    

    作用是:

    如果该连接数据的语句失败(比如连接不上),则屏蔽该失败的错误提示!

    运算符的优先级

    运算符,都有优先级问题!

    记住以下几条就可以了:

    • 要意识到运算符有优先级问题
    • 括号最优先,赋值最落后(通常)
    • 先乘除后加减
    • 大致:单目运算符〉算术运算符〉比较运算符〉逻辑运算符(除了“非”运算)

    能查到手册: 语言参考》运算符》运算符的优先级。

    流程控制

    流程图基本符号:

    只是人们习惯上使用的一些图形符号,以代表一定的含义,帮组别人理解流程过程。

    流程走向:

    开始结束:

    语句(块):

    判断:

    输入输出:

    if分支结构

    基本语法形式如下:

    if (条件判断1){
        分支1;
    }
    else  if (条件判断2){
        分支2;
    }
    else  if (条件判断3){
        分支3;
    }
    ......
    else {
        //else分支
    }
    

    switch分支结构

    形式:

    switch ( 表达式 ){
        case  条件值1:
            分支1;
            【break;】      //是可以省略部分,不是语法所必须;
        case  条件值2:
            分支2;
            【break;】      //是可以省略部分,不是语法所必须;
        ........
        default :
            default 分支;
    }
    

    举例如下:

    for循环结构


  • 相关阅读:
    LeetCode15 3Sum
    LeetCode10 Regular Expression Matching
    LeetCode20 Valid Parentheses
    LeetCode21 Merge Two Sorted Lists
    LeetCode13 Roman to Integer
    LeetCode12 Integer to Roman
    LeetCode11 Container With Most Water
    LeetCode19 Remove Nth Node From End of List
    LeetCode14 Longest Common Prefix
    LeetCode9 Palindrome Number
  • 原文地址:https://www.cnblogs.com/KeenLeung/p/6084503.html
Copyright © 2011-2022 走看看