zoukankan      html  css  js  c++  java
  • 对一道PHP比较运算符相关题目的思考

    题目源码:

    <?php
    show_source(__FILE__);
    $flag1="flag1 here";
    $flag2="flag2 here";
    $a=@$_GET['a'];
    $b=@$_GET['b'];
    if($a==0 and $a){
        echo $flag1;
    }
    if(is_numeric($b)){
        exit();
    }
    if($b>1234){
        echo $flag2;
    }
    ?>

    分析:

    很明显看出该题目考察的是对PHP的弱类型、比较运算符、以及类型转换的理解

    要让第一个if中的条件成立则$a==0和$a都要为真,传入“纯数字”肯定是不行的,同时$b也一样,由此要先知道以下知识点:

    1、HTML 表单并不传递整数、浮点数或者布尔值,它们只传递字符串

    2、is_numeric ( mixed $var ) : bool — 检测变量是否为数字数字字符串 如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。

    3、比较运算符

    例子             名称      结果

    $a == $b      等于     TRUE,如果类型转换后 $a 等于 $b。

    $a === $b    全等     TRUE,如果 $a 等于 $b,并且它们的类型也相同。

    4、字符串转换为数值 当一个字符串被当作一个数值来取值,其结果和类型如下:

    如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。

    该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。

    <?php
    $foo = 1 + "10.5";                // $foo is float (11.5)
    $foo = 1 + "-1.3e3";              // $foo is float (-1299)
    $foo = 1 + "bob-1.3e3";           // $foo is integer (1)
    $foo = 1 + "bob3";                // $foo is integer (1)
    $foo = 1 + "10 Small Pigs";       // $foo is integer (11)
    $foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
    $foo = "10.0 pigs " + 1;          // $foo is float (11)
    $foo = "10.0 pigs " + 1.0;        // $foo is float (11)     
    ?>

    5、转换为布尔值

    要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。

    当转换为 boolean 时,以下值被认为是 FALSE:

    • 布尔值 FALSE 本身
    • 整型值 0(零)
    • 浮点型值 0.0(零)
    • 空字符串,以及字符串 "0"
    • 不包括任何元素的数组
    • 特殊类型 NULL(包括尚未赋值的变量)
    • 从空标记生成的 SimpleXML 对象

    所有其它值都被认为是 TRUE(包括任何资源 和 NAN)。 Warning: -1 和其它非零值(不论正负)一样,被认为是 TRUE!

    综上不难得出:

    • $a满足:首字符为0或其他任意非数字字符的字符串即可 如:a、0x、0x0
    • $b满足:开头为大于1234的数字的非纯数字字符串即可 如:1235a、0x2333sss

    参考资料:

    https://www.php.net/manual/zh/language.operators.php
    https://www.php.net/manual/zh/types.comparisons.php
    https://www.php.net/manual/zh/language.types.string.php#language.types.string.conversion
    https://www.php.net/manual/zh/function.is-numeric.php
    https://www.php.net/manual/zh/language.types.boolean.php

  • 相关阅读:
    Codeforces 1265A Beautiful String
    1039 Course List for Student (25)
    1038 Recover the Smallest Number (30)
    1037 Magic Coupon (25)
    1024 Palindromic Number (25)
    1051 Pop Sequence (25)
    1019 General Palindromic Number (20)
    1031 Hello World for U (20)
    1012 The Best Rank (25)
    1011 World Cup Betting (20)
  • 原文地址:https://www.cnblogs.com/BxScope/p/10816006.html
Copyright © 2011-2022 走看看