一些收藏:运算符的优先级

今天看到几个题目比较有意思 分享一下。真的没有看出来自己哪里错了 但是一个没答对

今天正好群里有人在问一道PHP运算符优先级的问题,正好以前也遇到过类似的问题,这里整理一下吧,方便大家理解 以防掉坑:)

先来道简单的:

$a = 3;

if ($a = 5) {
    $a++;
}
var_dump($a);// (int)6
所以一个好的编码习惯 对于数字来说 最好把它放前面写成 5 == $a 这样即使你写成了 5 = $a 此时会报错 不会是隐式的赋值
来,我们接着看下一个坑.
$x = 2;
echo $x == 2 ? ‘我‘ : $x == 1 ? ‘你‘ : ‘它‘; //你
掉坑里的同学可能认为结果是我, 因为$x确实等于2 根据三元运算符的规则 ?前为true就输出我了.
这里的知识点在于运算符优先级以及三元运算符左结合的特性,其实真正的执行流程是这样的:
$x = 2;//将2赋值给变量x 没啥说的
echo $x == 2 ? ‘我‘ : $x == 1 ? ‘你‘ : ‘它‘; //你
//因为 == 的优先级比三元运算符高 所以转换成如下代码
#echo true ? ‘我‘ : false ? ‘你‘ : ‘它‘;
//由于三元运算符左结合的特性 所以如上代码等效于
#echo (true ? ‘我‘ : false) ? ‘你‘ : ‘它‘;
//先计算左边括号里的
#echo ‘我‘ ? ‘你‘ : ‘它‘; //到这里大家应该明白了吧
嗯,继续围观坑
$a = 3;
$b = 5;
if ($a = 3 || $b = 7)  {
    $a++;
    $b++;
}
var_dump($a);//(bool)true
var_dump($b);//(int)6
这题相信不少同学在做面试题的时候应该会遇到过,我第一次做的时候也被坑了。
被坑的同学相信答案大概有这么几种(4,6),(2,6)
$b基本没啥争议,关键是$a到底是神马情况,来我们来讲解一下这个坑。
#赋值 没啥说的
$a = 3;
$b = 5;
if ($a = 3 || $b = 7)  {
    $a++;
    $b++;
}
//知识点1: ||的优先级比=高
//所以$a = 3 || $b = 7 等效于 $a = (3 || $b = 7)
//因为3 || $b = 7整个表达式为真 所以返回true 赋值给$a 此时$a = true, 将执行括号里的内容
//知识点2: 递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是1
//也就意味着$a依然是true,不会是1++之后的2 $b依然++
//所以结果是$a是true,$b是自增之后的6

这里掉坑的同学会认为是3. 注意=号是赋值 == 比较运算符

时间: 2024-10-05 22:40:39

一些收藏:运算符的优先级的相关文章

(4)javascript的运算符以及运算符的优先级

                                运算符的使用方法 在javascript的程序中要完成各种各样的运算,是离不开运算符的. 在javascript中,按运算符类型可以分为算术运算符.赋值运算符.比较运算符.逻辑运算符.条件运算符等. ( 图片来自于W3School离线手册) 算术运算符案例: <!doctype html> <head> <meta http-equiv="content-type" content="

javascript中运算符的优先级

运算符优先级 JavaScript中的运算符优先级是一套规则.该规则在计算表达式时控制运算符执行的顺序.具有较高优先级的运算符先于较低优先级的运算符执行.例如,乘法的执行先于加法. 下表按从最高到最低的优先级列出JavaScript运算符.具有相同优先级的运算符按从左至右的顺序求值. 其中圆括号可用来改变运算符优先级所决定的求值顺序.这意味着圆括号中的表达式应在其用于表达式的其余部分之前全部被求值. z = 78 * (96 + 3 + 45) 在该表达式中有五个运算符: =, *, (), +

[c语言]运算符的优先级与结合性

c语言中运算符的优先级和结合性常常被人混淆一谈,本文目的在于简单谈谈两者的区别.本文举几个简单的例子说明,这些运算符也特别常用. 首先要明白的是:优先级决定表达式中各种不同的运算符起作用的优先次序:而结合性则在相邻的运算符的具有同等优先级时,决定表达式的结合方向. [赋值运算符“=”] 对于赋值运算符来说,常会用到的是连续赋值的表达式.比如“a=b=c”. 这里的变量b的两边都是赋值运算,优先级当然是相同的,那么应该怎么理解这个表达式呢?我们知道,赋值表达式具有“向右结合”的特性,这就表示这个表

java基础----&gt;运算符及其优先级

一.运算符 1)'/'  除法运算符 a) 如果是两个整数相除,只取整数商,如7/2=3 b) 如果是和浮点数相除,则取浮点数为商,如7/2F=3.5 2)自增,自减运算符"++""--" a) 使用自增或自减运算符的操作数必须是整数或者浮点数,char以及 boolean型的数不可以使用"++""--" 3)比较运算符,注意这些运算符的操作数的可取类型 4)逻辑运算符&&.&.|| .! a) 这些逻

python运算符的优先级顺序

最近开始学习python,听大家说python很强大,可以作为脚本语言,支持面向对象.面向过程编程,兼具编译性和解释性的一门动态语言.作为一名程序员有必要掌握这一门强大的"胶水语言".最近回顾了下,纪录一下运算符的优先级顺序,以下运算符的优先级依次递增: 运算符 Lambda #运算优先级最低 逻辑运算符: or 逻辑运算符: and 逻辑运算符:not 成员测试: in, not in 同一性测试: is, is not 比较: <,<=,>,>=,!=,==

【黑马程序员】————运算符的优先级

运算符的优先级(从高到低) 优先级 描述 运算符 1 括号 ().[] 2 正负号 +.- 3 自增自减,非 ++.--.! 4 乘除,取余 *./.% 5 加减 +.- 6 移位运算 <<.>>.>>> 7 大小关系 >.>=.<.<= 8 相等关系 ==.!= 9 按位与 & 10 按位异或 ^ 11 按位或 | 12 逻辑与 && 13 逻辑或 || 14 条件运算 ?: 15 赋值运算 =.+=.-=.*=.

【C/C++】运算符及其优先级

首先介绍表达式及语句的基本概念. 表达式: 一个表达式由运算量(亦称操作数)和运算符组成.例如,算术表达式A+B是由二元运算符"+"和操作数A.B组成的.A.B分别称为运算符+的左.右操作数. 在表达式中,一元运算符通常写在它的操作数前面,如-A,这种形式称为前缀形,但也有也在操作数的后面,如A++,这种形式称为后缀形.二元运算符一般写在两个操作数的中间,如X+Y. 表达式的性质在后文中会有所提及,如自增.自减运算符只能作用于变量,而不能作用于常量或表达式. 语句: 语句通常是以分号结

运算符和表达式,以及运算符的优先级

1.什么是运算符: 用于执行程序代码运算,会针对一个或以上操作数项目来进行运算. 2.运算符的分类: 用途分:基本运算符,条件运算符,逻辑运算符. 按操作的数分:一目,双目,三目运算. 3.什么是表达式: 是由数字.算符.数字分组符号(括号).自由变量和约束变量等以能求得数值的有意义排列方法所得的组合. 4.运算符的优先级: (1) 一目>双目>三目 (2) 有括号的最先 补充:自增1,自减1运算符均为单目运算,都具有右结合性.可有以下几种形式: ++i:i自增1后再参与其它运算. --i:i

[转]Java 运算符的优先级

Java 运算符的优先级(从高到低) 优先级 描述 运算符 1 括号 ().[] 2 正负号 +.- 3 自增自减,非 ++.--.! 4 乘除,取余 *./.% 5 加减 +.- 6 移位运算 <<.>>.>>> 7 大小关系 >.>=.<.<= 8 相等关系 ==.!= 9 按位与 & 10 按位异或 ^ 11 按位或 | 12 逻辑与 && 13 逻辑或 || 14 条件运算 ?: 15 赋值运算 =.+=.-