- 本文地址: https://www.laruence.com/2020/07/09/6015.html
- 转载请注明出处
这个本来是之前在微博上有个同学说他经常用来面试别人,大概是说,对于如下代码,你觉得会输出啥:
$a = true; if ($a) { echo "true"; } else label: { echo "false"; }
当时觉得有点偏,没想写,今天中午又有人问我,我想那就介绍下这个原因吧.
首先,上面的代码输出truefalse, 如果你知道原因,那就不用继续往下看了,如果不知道,那么:
这块让人比较迷惑的原因可能是因为,我们会很直观的认为:
label : { statement; }
应该是一个整体, 就好比类似:
if ($a) { } else switch($a) { }
或者:
if ($a) { } else do { } while (!$a);
因为在PHP的语法设计中,if else本质上是:
if_stmt: if_stmt_without_else T_ELSE statement
也就是说,else后面可以接一切statement,如果条件不成立,执行流就跳到else后面的statement,而while, switch都可以归约为statement。
但label这块稍微有点特别(可以说是一个设计违反直觉的”缺陷”吧), 在zend_language_parser.y中:
statement: ... | T_DO statement T_WHILE '(' expr ')' ';' {...} | T_SWITCH '(' expr ')' switch_case_list {...} | T_STRING ‘:’ { $$ = zend_ast_create(ZEND_AST_LABEL, $1); }
大家可以看到, do while, switch 都会联合他们的body归约为statement(语句),但标签(label)有点不同,”label :”本身会规约为一条statement, 这就导致了这个看起来比较迷惑的问题的出现,他本质上就变成了:
$a = true; if ($a) { echo "true"; } else { label: ; //单独的一条语句 } echo "false";
最后多说一句,我忘了之前在那看到的,说是这个世界上本无elseif,有的只不过是else (if statement),本质上其实就跟这个意思是一样的。 就是,else后面可以接语句(statement)。
善用这个结合switch, for, do while等,有的时候可以让我们的代码更精简。
比如,我们要遍历处理一个数组,当数组的长度为零的时候,要做点其他事,那很多人可能会这么写:
if (count($array)) { for ($i = 0; $i < count($array); $i++) { } } else { //数组为空的逻辑 }
但你也可以写成:
if (count($array) == 0) { //数组为空的逻辑 } else for ($i = 0; $i < count($array); $i++) { }
至于这俩中写法孰好孰坏, 那就是萝卜白菜了。
最后,大家如果在实际中遇到类似让大家觉得迷惑的问题,可以留言,也许以后也可以单独成文。
if else code is simple
Thanks
Your every blog is very helpful. thanks for code
Welcome to Gudlu Resort, a hidden gem nestled amidst the picturesque hills of Mudigere in Chikmagalur. If you are looking for a resorts in Mudigere , Gudlu Resort is the place to be. Surrounded by acres of lush greenery, Gudlu Resort offers a range of luxurious accommodations that are perfect for couples, families, and groups. Each room is well-appointed with modern amenities and offers breathtaking views of the surrounding hills and valleys.
Welcome to Tattvamretreat Resort, Bangalore – a serene and tranquil ayurveda resorts in bangalore that offers a holistic approach to wellness through Ayurveda and Yoga. Tucked away amidst lush greenery and rolling hills, Tattvamretreat Resort is a perfect getaway for those seeking a peaceful and rejuvenating experience.
Welcome to Gari Resort, Bangalore – one of the best day outing resorts in Bangalore that offers a unique blend of luxury, comfort, and relaxation. If you are looking for the perfect escape from the hustle and bustle of city life, Gari Resort is the place for you.
不应该保留这些迷惑
这种奇淫巧计的意义何在呢,写法魔性,又很难维护偏僻
奇淫巧技!!赞
99.99%的人原理都懂,但有99%的人会跳坑里吧。。。
我的天老爷 这么写大概会被打的吧
会的 看热闹的
哈哈哈哈哈哈
哈哈哈哈哈啊哈哈哈
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
啊哈哈哈哈哈哈哈哈哈
代码格式化工具 会自动转换这种写法
这么写太不利于阅读了 哈哈哈
怎么回复不了呢???
这么写有点反人类 哈哈
考察这些还不如开发规范中约定ifelse必须带花括号。
我一般都这样写
if (count($array) == 0) {
//数组为空的逻辑
}
for ($i = 0; $i < count($array); $i++) {
}
Fungsi kaca film pada mobil sejatinya yakni mengurangi intensitas cahaya matahari yang masuk ke dalam kabin. Tapi, adakah fungsi … kunjungi https://kacafilm3m.netlify.app/kaca-film-3m-black-beauty-bmw-m6.html untuk info selengkapnya
细节决定成败 还是鸡蛋里面挑骨头呢
真棒啊
这种理解好像太复杂.
因为您把 else {statement} 看成了一种语法
实际上只是else后面因为是单条语句而省略了花括号
就如
if($a){
echo ‘a’;
}else{
foreach($a as $v){
echo $v;
}
}
这里的花括号都可以省略, 所以简写成
if($a)
echo ‘a’;
else foreach($a as $v)
echo $v;
这并不是一种语法
对于不懂Clang的人来说, 这么理解还真的是简单易懂. O(∩_∩)O哈哈~
感觉你在黑微博面试官,但是我拿不出证据
这种人聪明,但是没把聪明用到改用的地方。真是闲的蛋疼,写代码是让人看懂而不是显的自己多高深,没有任何意义。
除非性能更优
不喝拉倒,梁惠凯说:“两件事,沙子的事儿冬冬给你说了吧?还有一件事儿,矿山正式投产了,目前是微利,但是马上就能卖石子,这样就能盈利了。按照咱们的约定,给你百分之二十的利润。你给我个卡号,每个月打给你。”http://szntpioewkuy.bravesites.com/
我反倒是觉得,知道答案才不正常,这人是不是从哪看到了漏的题,提前找了答案。
我经常if else for….
这反人类的写法,当作语法研究研究还可以;如果在项目这样搞,可以滚蛋了!
ifelse的奇技淫巧,啧啧啧….
看到大佬们的回复,知道了也不敢这么用了 😂
底层有意思
反人类自觉的代码,居然有人拿来做面试题,有多大意思?
喜欢装13的人才会问这种东西吧 ,之前去某公司,问二进制,我真想问候他呢。净搞些没用的
如果有人这样在我的项目里写代码,我就让他滚蛋
f
一个细节一个细节掌握
奇淫巧计,有点意思~~