小编psm*_*ars的帖子

为什么Python字符串中的3个反斜杠等于4?

你能告诉我为什么'?\\\?'=='?\\\\?'给出True?这让我发疯,我找不到合理的答案......

>>> list('?\\\?')
['?', '\\', '\\', '?']
>>> list('?\\\\?')
['?', '\\', '\\', '?']
Run Code Online (Sandbox Code Playgroud)

python python-2.7

90
推荐指数
4
解决办法
6296
查看次数

连接所有岛屿的最低成本是多少?

有一个大小为N x M的网格.一些细胞是由'0'表示的,而其他细胞是.每个水电池上都有一个数字,表示在该电池上制造的电桥的成本.您必须找到所有岛屿可以连接的最低成本.如果单元共享边或顶点,则单元连接到另一个单元.

可以用什么算法来解决这个问题?
编辑:如果N,M的值非常小,可以用作蛮力方法,比如说NxM <= 100?

示例:在给定图像中,绿色单元格表示岛屿,蓝色单元格表示水,浅蓝色单元格表示应在其上制作桥梁的单元格.因此,对于下面的图像,答案将是17.

http://i.imgur.com/ClcboBy.png

最初我想到将所有岛屿标记为节点并用最短的桥连接每对岛屿.然后问题可以减少到最小生成树,但在这种方法中我错过了边缘重叠的情况.例如,在下图中,任意两个岛之间的最短距离为7(标记为黄色),因此通过使用最小生成树,答案为14,但答案应为11(以浅蓝色标记).

图像2

algorithm heuristics mathematical-optimization linear-programming dynamic-programming

82
推荐指数
2
解决办法
8847
查看次数

是否允许编译器优化本地volatile变量?

是否允许编译器对此进行优化(根据C++ 17标准):

int fn() {
    volatile int x = 0;
    return x;
}
Run Code Online (Sandbox Code Playgroud)

这个?

int fn() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果是,为什么?如果没有,为什么不呢?


这里有一些关于这个主题的思考:当前编译器编译fn()为放在堆栈上的局部变量,然后返回它.例如,在x86-64上,gcc创建了这个:

mov    DWORD PTR [rsp-0x4],0x0 // this is x
mov    eax,DWORD PTR [rsp-0x4] // eax is the return register
ret    
Run Code Online (Sandbox Code Playgroud)

现在,据我所知,标准并没有说应该将一个局部volatile变量放在堆栈上.所以,这个版本同样好:

mov    edx,0x0 // this is x
mov    eax,edx // eax is the return
ret    
Run Code Online (Sandbox Code Playgroud)

这里,edx商店x.但是现在,为什么要停在这里?由于edxeax均为零,我们可以只说:

xor    eax,eax // eax is the return, and x as well
ret    
Run Code Online (Sandbox Code Playgroud)

我们转变 …

c++ volatile language-lawyer c++17

75
推荐指数
5
解决办法
5748
查看次数

为什么PHP将上传的文件存储在临时位置,有什么好处?

好吧,我在这个领域是全新的,并通过一些教程,我发现在PHP上传文件时,它将它们存储在一个临时位置.

$file_temp=$_FILES['file']['tmp_name'];
$file_loc="Upload".$file_name;
move_uploaded_files($file_temp,$file_loc);
Run Code Online (Sandbox Code Playgroud)

现在为什么PHP不允许直接将文件上传到所需的位置?为什么它们存储在扩展名为.tmp的临时位置,我们从这个策略中获得了什么好处?

php file-upload

65
推荐指数
3
解决办法
5060
查看次数

重用内存位置安全吗?

这个问题基于一些移植到C++的现有C代码.我只是对它是否"安全"感兴趣.我已经知道我不会这样写的.我知道这里的代码基本上是C而不是C++,但它是用C++编译器编译的,我知道标准有时略有不同.

我有一个分配一些内存的功能.我把返回的东西void*投入int*并开始使用它.

后来我把返回void*到了a Data*并开始使用它.

这在C++中是安全的吗?

示例: -

void* data = malloc(10000);

int* data_i = (int*)data;
*data_i = 123;
printf("%d\n", *data_i);

Data* data_d = (Data*)data;
data_d->value = 456;
printf("%d\n", data_d->value);
Run Code Online (Sandbox Code Playgroud)

我从来没有读过通过与存储类型不同的类型使用的变量,但担心编译器可能会看到它data_i并且data_d是不同的类型,因此不能在法律上相互别名并决定重新排序我的代码,例如将存储放在data_d第一个之前printf.哪会破坏一切.

然而,这是一直使用的模式.如果你在两次访问之间插入一个free,malloc我不相信它会改变任何东西,因为它不会触及受影响的内存本身,并且可以重用相同的数据.

我的代码被破坏了还是"正确"?

c++

64
推荐指数
7
解决办法
4605
查看次数

char*envp []是main()可移植的第三个参数

为了在C程序中获取环境变量,可以使用以下内容:

  • getenv()
  • extern char **environ;

但除了上面提到的,使用char *envp[]第三个参数main()来获取环境变量被认为是标准的一部分?

#include <stdio.h>

int main(int argc, char *argv[], char *envp[])
{
    while(*envp)
        printf("%s\n",*envp++);
}
Run Code Online (Sandbox Code Playgroud)

char *envp[]便携式?

c environment-variables command-line-arguments

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

无法访问的代码工作正常 - 如何?

从我的理解下面我写了不应该编译的语句代码"我不可达"是后return.

但是,编译绝对正常.

同样来自JLS:无法访问的语句,它不应该编译.

来自规范14.21无法到达的声明:

如果满足以下两个条件,则try语句可以正常完成:

  • try块可以正常完成,或者任何catch块都可以正常完成.

  • 如果try语句有finally块,则finally块可以正常完成.

这里的try块无法正常完成,但catch块可以和finally块一样,所以我在这里很困惑

    public class Test1 {
     public static void main(String[] args) {
        try {
            return;

        } catch (Exception e) {
            System.out.println("catch");

        } finally {
            System.out.println("finally");
        }
        System.out.println("I am unreachable??!!!");
    }
}
Run Code Online (Sandbox Code Playgroud)

有人能帮我理解这种行为吗?

java try-catch

57
推荐指数
3
解决办法
7011
查看次数

为什么允许指向内联函数的指针?

我有两个问题:

1)为什么在C++中允许指向内联函数的指针?我已经读过内联函数的代码只是被复制到函数调用语句中,内联函数中没有编译时内存分配.那么为什么内联函数存在一个指针,因为内联函数没有固定的内存地址?

2)考虑以下代码:

inline void func()    
{
    int n=0;
    cout<<(&n);
} 
Run Code Online (Sandbox Code Playgroud)

它是否应该打印不同值的n每次func()调用地址?[因为我认为每次复制内联函数代码时,必须重新分配局部变量(而在正常函数的情况下,重新初始化会发生)]

我是初学者,为了加强我的概念,我问了这个问题.如果我在任何地方都错了,请纠正我.

c++ inline function

52
推荐指数
4
解决办法
6769
查看次数

通过从本地C风格的数组返回指针来获取悬空指针

我对以下代码感到有点困惑:

#include <iostream>

const char* f()
{
    const char* arr[]={"test"};
    return arr[0];
}

int main()
{
    auto x = f();
    std::cout << x;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这段代码应该是UB(未定义的行为).我们返回一个指向本地范围内的C风格数组元素的指针.事情应该出问题.但是,我测试过的编译器都没有抱怨(我用过-Wall -Wextra -pedanticg ++和clang).valgrind也不抱怨.

上面的代码是有效的还是人们会想到的UB?

PS:运行它似乎产生"正确"的结果,即显示"测试",但这并不表示正确性.

c++ memory pointers undefined-behavior

48
推荐指数
1
解决办法
2491
查看次数

为什么Java类文件格式的前四个字节是CAFEBABE?

为什么Java类文件格式的前四个字节是CAFEBABE?是谁命名的?

你的观点/猜测?

来源:IBM Java编程动态

java

43
推荐指数
1
解决办法
2万
查看次数