你能告诉我为什么'?\\\?'=='?\\\\?'
给出True
?这让我发疯,我找不到合理的答案......
>>> list('?\\\?')
['?', '\\', '\\', '?']
>>> list('?\\\\?')
['?', '\\', '\\', '?']
Run Code Online (Sandbox Code Playgroud) 有一个大小为N x M的网格.一些细胞是由'0'表示的岛,而其他细胞是水.每个水电池上都有一个数字,表示在该电池上制造的电桥的成本.您必须找到所有岛屿可以连接的最低成本.如果单元共享边或顶点,则单元连接到另一个单元.
可以用什么算法来解决这个问题?
编辑:如果N,M的值非常小,可以用作蛮力方法,比如说NxM <= 100?
示例:在给定图像中,绿色单元格表示岛屿,蓝色单元格表示水,浅蓝色单元格表示应在其上制作桥梁的单元格.因此,对于下面的图像,答案将是17.
最初我想到将所有岛屿标记为节点并用最短的桥连接每对岛屿.然后问题可以减少到最小生成树,但在这种方法中我错过了边缘重叠的情况.例如,在下图中,任意两个岛之间的最短距离为7(标记为黄色),因此通过使用最小生成树,答案为14,但答案应为11(以浅蓝色标记).
algorithm heuristics mathematical-optimization linear-programming dynamic-programming
是否允许编译器对此进行优化(根据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
.但是现在,为什么要停在这里?由于edx
和eax
均为零,我们可以只说:
xor eax,eax // eax is the return, and x as well
ret
Run Code Online (Sandbox Code Playgroud)
我们转变 …
好吧,我在这个领域是全新的,并通过一些教程,我发现在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的临时位置,我们从这个策略中获得了什么好处?
这个问题基于一些移植到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
程序中获取环境变量,可以使用以下内容:
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[]
便携式?
从我的理解下面我写了不应该编译的语句代码"我不可达"是后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)
有人能帮我理解这种行为吗?
我有两个问题:
1)为什么在C++中允许指向内联函数的指针?我已经读过内联函数的代码只是被复制到函数调用语句中,内联函数中没有编译时内存分配.那么为什么内联函数存在一个指针,因为内联函数没有固定的内存地址?
2)考虑以下代码:
inline void func()
{
int n=0;
cout<<(&n);
}
Run Code Online (Sandbox Code Playgroud)
它是否应该打印不同值的n
每次func()
调用地址?[因为我认为每次复制内联函数代码时,必须重新分配局部变量(而在正常函数的情况下,重新初始化会发生)]
我是初学者,为了加强我的概念,我问了这个问题.如果我在任何地方都错了,请纠正我.
我对以下代码感到有点困惑:
#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 -pedantic
g ++和clang).valgrind
也不抱怨.
上面的代码是有效的还是人们会想到的UB?
PS:运行它似乎产生"正确"的结果,即显示"测试",但这并不表示正确性.