- 本文地址: https://www.laruence.com/2019/03/01/4904.html
- 转载请注明出处
这个源自于一个看似很诡异的问题:
if (print("1\n") && print("2\n") && print("3\n") && print("4\n")) { ; }
你期待这段代码输出什么呢?
实际上的输出是:
4 111
很多时候我们会忽略了print是一个语法结构(language constructs), 他并不是一个函数, 参数的list并不要求有括号(即使你写了括号, 括号也会在语法分析阶段被忽略), 他只是一个永远返回结果是1的"表达式(expr)":
expr : T_PRINT expr | '(' expr ')' ;
所以其实上面的代码在php看来是:
if (print ("1\n" && print ("2\n" && print ("3\n" && print "4\n")))) { ; }
所以就是, 输出4, 然后输出 "3\n" && print的结果1 , 然后输出 "2\n" && 1, 最后是 "1\n" && 1
而如果想要达到上面代码的本身想要的意图, 我们应该这么写:
if ((print "1\n") && (print "2\n") && (print "3\n") && (print "4\n")) { ; }
Most attractive article and infomative also thanks for sharing with us.
https://reachontop.in/
so much great information on here, : D.
Thank you very much for this great post
https://www.mufasabet.one/
https://www.dna24bet.com/
the best online gaming for investment 24 hours
https://www.truthbet168.com/
Thank you very much for this great post
Good I appreciated your work very thanks.
谢谢你很好的文章
Thanks
truthbet
The best sites in Thailand and make good money
ltobet
Good I appreciated your work very thanks
坑爹面试题+1
i m very glad thanks nice post you shared with us
网站内容还是挺不错的,谢谢博主。还有博客应该是WORDPRESS做的吧,感觉美观度还可以提高,谢谢。我自已是搞前端设计的,你的代码可以做精简一点。
给我看笑了
老哥稳
看笑了
厉害,勇气可嘉,给你点个赞。
给爷整笑了
难道博客不是WordPress做的???有啥笑的?
给爷整笑了..去百度一下博主吧
代码可以做精简一点哈哈哈哈哈哈哈哈哈哈哈哈哈哈
好大的胆子。。。。。
不错支持一下
I’m looking for help. Can anybody do?
if (print 0 && print 1){
echo “aaa”;
}
为何这个输出的只有“aaa”? 不是 print 1 输出1 返回 1 然后 print 0&&1 输出(0或1 ?) 返回1 吗? 应该如何理解?
print 0 && print 1 ===等价于===> print (0 && print 1) ===等价于===> print false ===返回===> 1
(0 && print 1) 这个语句中因为是‘&&’(前面为假,后面就不会执行),所以print 1不会执行,直接返回false。
php中 print false 或者 echo false 这种语句都不会有任何输出,而print 语句本身返回1(真),所以就执行if内的语句,输出 aaa
你好请问 eval 怎么禁用 从源码里面 修改禁止执行
评论好多链接啊
不错支持一夏。技术分享
支持一下,文章不错技术分享、
虽然实际编码没人会使用这个知识点,但了解一下挺有意思的
不错支持一下
支持一下不错
正好用到这个,学习了。
拼多多空包网很喜欢你
你是最好的人! 非常感谢你!
支持一下写的很好
很多时候我们会忽略了print是一个语法结构(language constructs), 他并不是一个函数, 参数的list并不要求有括号(即使你写了括号, 括号也会在语法分析阶段被忽略), 他只是一个永远返回结果是1的”表达式(expr)”
不错,喜欢
支持一下
支持一下不错
Comment test;
不错支持一下
学习了不错支持一下
学习了
分析的不错,支持一下
支持一下
不错
过来留言文章不错
鸟哥,我们phper该转Go吗?前途迷茫啊,不知道哪天就整个PHP项目组被裁掉…
写的不错,非常好
学习了
支持一下不错
讲解的不错,非常喜欢,感谢分享
讲解的不错,非常喜欢,另外我也写了有关PHP面向对象的总结,分享给大家阅读。
PHP 高级教程-面向对象编程(OOP)[第一章] https://www.sky8g.com/news/3107/
print和echo差不多都是语言结构,只不过echo可以一次多个值。那上面的例子print换成echo为什么就报错了
我想学习,我喜欢这种解释方式,我期待下一次更新。你能救我吗?
能救你的只有你自己。
博客速度更快!!!
请求分享建议。
do you open a place for a course if you provide a place for courses there is an address that I can contact
https://github.com/gevilrror/tmock
做了一个可以mock php函数的扩展,蹭下热度!:)
受教了
受教了
我一开始不能理解,但是在我百度了“表达式”这个词后就理解了。但是我还是觉得PHP应该跟我一样笨才对,为啥要看成这样if (print (“1\n” && print (“2\n” && print (“3\n” && print “4\n”)))) {
;
}
而不是看成这样 if ((print “1\n”) && (print “2\n”) && (print “3\n”) && (print “4\n”)) {
;
}
还是不是挺明白,能解析下吗
学习了,就喜欢这种讲解方式,期待下回更新哈。
学习了
不错,学习了
受教了
学习了
不是吗???
print不是函数?是白学了
简单明了
学习了!!!!
print不是函数????
了解它的用法
Cool
还以为鸟哥忘记了博客密码
哈哈
确实容易混淆
感觉PHP语法太宽松了,这样反而容易出错。
妈妈说,凡是遇到有运算符号的,请一律加括号。
[…] 本文地址: http://www.laruence.com/2019/03/01/4904.html […]
这是最简单明了的解释! 非常感谢你!
大佬收徒弟吗
跟python2中的print一样,不是一个函数,不过到python3中已经变成函数了。
博客速度变快很多!!!
是不是有什么黑科技? 求鸟哥分享.
[…] 文章转自鸟哥博客:http://www.laruence.com/2019/03/01/4904.html […]
博客终于更新了,蹭下热度! 2333333
嘿,鸟哥的BLOG更新了新模板…终于跟得上时代了。
isset , unset之类的在文档上的表述就是函数啊。
http://php.net/manual/zh/function.isset.php
echo就不是,http://php.net/manual/zh/function.echo.php
我把那段表述不正确的删除了,不过isset和unset依旧是语言结构, 他们会在编译阶段直接翻译为对应的opcode, 只不过他们对应的语法解析规则中定义为了需要有括号。。
酷
举个栗子:
die(‘a’); //打印a并终止程序
die ‘a’; //语法错误
既然不是函数,不知道这个怎么理解
受教了
从没仔细思考过这个问题,只认知print不是函数。。。
在升级PHP7的时候应该考虑将print定义成内置函数,而不是语法结构。这种特性会莫名增加语言的复杂度。
难道是特别特别早的时候,PHP还没有函数。所以临时定义了一个这样的语法结构?
不然早就已经废掉了。