在另一个问题中指出,在括号中包装PHP函数调用的结果可以某种方式将结果转换为完全成熟的表达式,以便以下工作:
<?php
error_reporting(E_ALL | E_STRICT);
function get_array() {
return array();
}
function foo() {
// return reset(get_array());
// ^ error: "Only variables should be passed by reference"
return reset((get_array()));
// ^ OK
}
foo();
Run Code Online (Sandbox Code Playgroud)
我试图在文档中找到任何内容,以明确无误地解释这里发生的事情.与C++不同,我不太了解PHP语法及其语句/表达式的处理方法,以便自己派生它.
有关此行为的文档中是否隐藏了任何内容?如果没有,其他人可以解释它而不诉诸假设吗?
我首先发现这个EBNF声称代表PHP语法,并试图自己解码我的脚本,但最终放弃了.
然后,使用phc生成.dot两个foo()变体的文件,我使用以下命令为两个脚本生成 AST图像:
$ yum install phc graphviz
$ phc --dump-ast-dot test1.php > test1.dot
$ dot -Tpng test1.dot > test1.png
$ phc --dump-ast-dot test2.php > test2.dot
$ dot -Tpng …Run Code Online (Sandbox Code Playgroud) 您可能知道,C++ 11引入了constexpr关键字.
C++ 11引入了关键字constexpr,它允许用户保证函数或对象构造函数是编译时常量.[...]这允许编译器理解并验证[函数名称]是编译时常量.
我的问题是为什么对可以声明的函数的形式有严格的限制.我理解保证功能是纯粹的愿望,但考虑到这一点:
在函数上使用constexpr会对函数的作用施加一些限制.首先,该函数必须具有非void返回类型.其次,函数体不能声明变量或定义新类型.第三,正文可能只包含声明,空语句和单个return语句.必须存在参数值,以便在参数替换后,return语句中的表达式生成常量表达式.
这意味着这个纯函数是非法的:
constexpr int maybeInCppC1Y(int a, int b)
{
if (a>0)
return a+b;
else
return a-b;
//can be written as return (a>0) ? (a+b):(a-b); but that isnt the point
}
Run Code Online (Sandbox Code Playgroud)
你也不能定义局部变量... :(所以我想知道这是一个设计决定,还是编译器吮吸来证明功能a是纯粹的?
在我的iPhone应用程序的堆栈跟踪中,我看到一个叫做调用的东西PurpleEventCallback.我无法找到任何文件.这是什么?

是否有适用于Firefox的工具/插件/功能,它会转储您在页面/脚本中创建的Javascript对象的内存使用情况?我知道Firebug的探查器,但我想要的不仅仅是时间.类似于Yourkit对Java内存使用情况进行分析的东西.
原因是同事正在使用id作为数组中的"键",并且当他这样做时创建1000个空插槽.他认为这是无害的,而我的意见则不同.我想提供一些证据来证明我是对还是不对.
在Chrome中,我们有些奇怪
> new Date("2014-01-01") - new Date("2014/01/01")
< 3600000
Run Code Online (Sandbox Code Playgroud)
这是因为
new Date("2014-01-01")
Wed Jan 01 2014 01:00:00 GMT+0100 (CET)
Run Code Online (Sandbox Code Playgroud)
而
new Date("2014/01/01")
Wed Jan 01 2014 00:00:00 GMT+0100 (CET)
Run Code Online (Sandbox Code Playgroud)
为什么' - '似乎增加1小时的时间?
我在C++中学到的第一件事就是
#include <iostream>
int main()
{
std::cout<<"Hello, World!\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只会出现并迅速消失而不会停顿.为了防止这种情况,我不得不去记事本,然后保存
helloworld.exe
pause
Run Code Online (Sandbox Code Playgroud)
ASE
helloworld.bat
Run Code Online (Sandbox Code Playgroud)
当我需要创建一堆小测试程序时,这很乏味,最终我只是把while(true);我的大部分测试程序放在最后,这样我才能看到结果.我可以使用更好的等待功能吗?
是否在"if"语句中声明和赋值变量仅在"if"块内或整个函数内可见?
我是否在以下代码中执行此操作?(似乎工作,但多次声明"var结构"似乎很尴尬)任何更清洁的解决方案?
function actionPane(state) {
if(state === "ed") {
var structure = {
"element" : "div",
"attr" : {
"class" : "actionPane"
},
"contains" : [{
"element" : "a",
"attr" : {
"title" : "edit",
"href" : "#",
"class" : "edit"
},
"contains" : ""
}, {
"element" : "a",
"attr" : {
"title" : "delete",
"href" : "#",
"class" : "delete"
},
"contains" : ""
}]
}
} else {
var structure = {
"element" : "div",
"attr" : …Run Code Online (Sandbox Code Playgroud) 以下代码在C++ 98,C++ 11和C++ 14模式下对我尝试的所有GCC版本产生后续编译错误:
struct T
{
T(void* x) : (x) {}
};
// main.cpp: In constructor 'T::T(void*)':
// main.cpp:3:18: error: anachronistic old-style base class initializer [-fpermissive]
// T(void* x) : (x) {}
// ^
// main.cpp:3:16: error: unnamed initializer for 'T', which has no base classes
// T(void* x) : (x) {}
Run Code Online (Sandbox Code Playgroud)
当然,它显然是破碎的代码,因为我实际上并没有初始化任何东西.
但为什么它是基类初始化器,为什么它是"不合时宜的",而不是简单的错误?曾经有效吗?什么时候?这是什么意思?
我在网上找到的唯一的相关参考文献是,当一个成员名称被意外地宏出时,人们遇到了错误,实际上产生了与上面相同的代码:
#define bar
// ^ some library could have done this
struct T
{
T(int x)
: bar(x) // effectively just `: …Run Code Online (Sandbox Code Playgroud) 我从这段代码中遇到了麻烦,在我从main.cpp文件中取出这个类并将其拆分为.h和.cpp后,编译器开始抱怨我在void中使用的默认参数.
/* PBASE.H */
class pBase : public sf::Thread {
private:
bool Running;
public:
sf::Mutex Mutex;
WORD OriginalColor;
pBase(){
Launch();
Running = true;
OriginalColor = 0x7;
}
void progressBar(int , int);
bool key_pressed();
void setColor( int );
void setTitle( LPCWSTR );
bool test_connection(){
if(Running == false){
return 0;
}
else{
return 1;
}
return 0;
}
void Stop(){
Running = false;
if(Running == false) Wait();
}
};
Run Code Online (Sandbox Code Playgroud)
/* PBASE.CPP */
// ... other stuff above
void pBase::setColor( int _color = …Run Code Online (Sandbox Code Playgroud) #include <iostream>
using namespace std;
struct A
{
A() { cout << "A" << endl; }
~A() { cout << "~A" << endl; }
};
A Ok() { return {}; }
A NotOk() { throw "NotOk"; }
struct B
{
A a1;
A a2;
};
void f(B) {}
int main()
{
try
{
f({ Ok(), NotOk() });
}
catch (...)
{}
}
Run Code Online (Sandbox Code Playgroud)
vc++并clang输出:
A
~A
Run Code Online (Sandbox Code Playgroud)
虽然gcc产出:
A
Run Code Online (Sandbox Code Playgroud)
这似乎是GCC的一个严重错误.