小编Lig*_*ica的帖子

括号改变函数调用结果的语义

另一个问题中指出,在括号中包装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)

php php-internals

52
推荐指数
1
解决办法
2364
查看次数

为什么C++ 11 constexpr如此限制?

您可能知道,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是纯粹的?

c++ constexpr c++11

52
推荐指数
3
解决办法
1万
查看次数

什么是PurpleEventCallback?

在我的iPhone应用程序的堆栈跟踪中,我看到一个叫做调用的东西PurpleEventCallback.我无法找到任何文件.这是什么?

PurpleEventCallback

iphone xcode stack-trace ios

52
推荐指数
2
解决办法
2711
查看次数

适用于Firefox的Javascript内存分析器

是否有适用于Firefox的工具/插件/功能,它会转储您在页面/脚本中创建的Javascript对象的内存使用情况?我知道Firebug的探查器,但我想要的不仅仅是时间.类似于Yourkit对Java内存使用情况进行分析的东西.

原因是同事正在使用id作为数组中的"键",并且当他这样做时创建1000个空插槽.他认为这是无害的,而我的意见则不同.我想提供一些证据来证明我是对还是不对.

javascript memory firefox profiling

51
推荐指数
4
解决办法
3万
查看次数

为什么YYYY-MM-DD!= YYYY/MM/DD

在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小时的时间?

javascript

51
推荐指数
2
解决办法
1752
查看次数

在C++中是否有一个像样的等待函数?

我在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);我的大部分测试程序放在最后,这样我才能看到结果.我可以使用更好的等待功能吗?

c++ wait

49
推荐指数
7
解决办法
31万
查看次数

IF语句中的javascript变量范围

是否在"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)

javascript variables scope if-statement

49
推荐指数
3
解决办法
5万
查看次数

错误:不合时宜的旧式基类初始化程序

以下代码在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)

c++ gcc c++11 c++03 c++14

49
推荐指数
3
解决办法
3852
查看次数

编译器抱怨我的默认参数?

我从这段代码中遇到了麻烦,在我从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)

c++ class optional-parameters

47
推荐指数
2
解决办法
5万
查看次数

C++标准是否保证统一初始化是异常安全的?

#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的一个严重错误.

供参考,参见GCC bug 66139AndrzejKrzemieński撰写的"GCC中的一个严重错误" …

c++ gcc exception uniform-initialization c++17

47
推荐指数
1
解决办法
1754
查看次数