小编Jay*_*esh的帖子

Python是否优化了仅用作返回值的变量?

以下两个代码片段之间是否存在任何最终差异?第一个为函数中的变量赋值,然后返回该变量.第二个函数只是直接返回值.

Python会将它们转换为等效的字节码吗?其中一个更快吗?

案例1:

def func():
    a = 42
    return a
Run Code Online (Sandbox Code Playgroud)

案例2:

def func():
    return 42
Run Code Online (Sandbox Code Playgroud)

python interpreter python-internals

105
推荐指数
1
解决办法
6198
查看次数

C++警告:将double除以零

情况1:

#include <iostream>

int main()
{
    double d = 15.50;
    std::cout<<(d/0.0)<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它编译时没有任何警告和打印inf.好的,C++可以处理除零,(实时查看).

但,

案例2:

#include <iostream>

int main()
{
    double d = 15.50;
    std::cout<<(d/0)<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

编译器发出以下警告(请参见实时):

warning: division by zero [-Wdiv-by-zero]
     std::cout<<(d/0)<<std::endl;
Run Code Online (Sandbox Code Playgroud)

为什么编译器会在第二种情况下发出警告?

0 != 0.0吗?

编辑:

#include <iostream>

int main()
{
    if(0 == 0.0)
        std::cout<<"Same"<<std::endl;
    else
        std::cout<<"Not same"<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Same
Run Code Online (Sandbox Code Playgroud)

c++ floating-point gcc divide-by-zero

97
推荐指数
5
解决办法
9340
查看次数

"int mask =〜0;"的目的是什么?

我看到下面的代码行这里的C.

 int mask = ~0;
Run Code Online (Sandbox Code Playgroud)

我已经打印了maskC和C++ 的值.它总是打印-1.

所以我确实有一些问题:

  • 为什么~0要为掩码变量赋值?
  • 目的是~0什么?
  • 我们可以用-1而不是~0吗?

c c++ bit-manipulation masking bit-masks

44
推荐指数
4
解决办法
4066
查看次数

为什么函数重载在C++中会产生模糊错误?

在下面的代码段,在函数调用f(1),1是文字型的int并在第一功能void f(double d)参数类型是double和第二函数void f(short int i)参数类型是短整型.

1是一个int不是double类型的类型,那么为什么编译器会产生模糊错误?

#include <iostream>
using namespace std;

void f(double d)  // First function
{
    cout<<d<<endl;
}

void f(short int i) // Second function
{
    cout<<i<<endl;
}

int main()
{
    f(1); // 1 is a literal of type int
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ overloading short ambiguous c++14

20
推荐指数
1
解决办法
1626
查看次数

在C和C++中arr [i] = i ++和i = i + 1语句的行为

在C和C++语言中,该arr[i] = i++;语句调用未定义的行为.为什么语句i = i + 1;不会调用未定义的行为?

c c++ undefined-behavior sequence-points c++14

18
推荐指数
4
解决办法
1959
查看次数

"new int [5] {};"中"{}"的目的是什么?

如果我们写下这样的话:

int *arr = new int[5];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,系统为5个类型的元素动态分配空间,int并返回指向序列的第一个元素的指针.

但是,一旦我看到以下代码:

int *arr = new int[5]{};
Run Code Online (Sandbox Code Playgroud)

那么,运营商{}之后的意义new何在?{}这段代码的目的是什么?

我用自己的值初始化了数组,如下所示:

#include <iostream>

int main()
{
    int* a = new int[5]{1};
    for(int i = 0; i < 5; i++)
        std::cout<< a[i]<<' ';

    delete[] a;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

只有第一个元素打印1.为什么?

c++ initialization new-operator dynamic-memory-allocation c++11

14
推荐指数
1
解决办法
1313
查看次数

负零(-0.0)与正零(+0.0)相比的行为

在我的代码中,

float f = -0.0; // Negative 
Run Code Online (Sandbox Code Playgroud)

并与负零相比

f == -0.0f
Run Code Online (Sandbox Code Playgroud)

结果将是true.

float f = 0.0; // Positive
Run Code Online (Sandbox Code Playgroud)

并与负零相比

f == -0.0f
Run Code Online (Sandbox Code Playgroud)

另外,结果将是true代替false

为什么在这两种情况下都是真的?


这是一个测试它的MCVE(住在coliru上):

#include <iostream>

int main()
{
    float f = -0.0;

    std::cout<<"==== > " << f <<std::endl<<std::endl;

    if(f == -0.0f)
    {
        std::cout<<"true"<<std::endl;
    }
    else
    {
        std::cout<<"false"<<std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

==== > -0  // Here print negative zero

true
Run Code Online (Sandbox Code Playgroud)

c++ floating-point ieee-754

11
推荐指数
3
解决办法
6574
查看次数

使用"std :: valarray"是个好主意?

std::valarrayNicolai M. Josuttis写的一本C++书中读过.他在他的书"C++标准库"第17.4章中写道:

valarray类的设计并不是很好.事实上,没有人试图确定最终规范是否有效.发生这种情况是因为没有人对这些课程感到"负责".在标准完成之前很久就将valarray引入C++标准库的人离开了委员会.因此,很少使用valarrays.

那么,使用std::valarray哪个好主意?

c++ c++11 valarray

11
推荐指数
1
解决办法
1438
查看次数

为什么GCC没有在匿名变量上显示任何错误?

我读了这个问题,解释了C++中匿名变量是如何无效的.

但是下面的程序在GCC 7.2上没有任何警告或错误编译(即使有-Wall) - 演示:

int main() {
    int (*); // anonymous variable?
}
Run Code Online (Sandbox Code Playgroud)

在这里,这显然也是一个整数类型的匿名变量.那么,为什么GCC没有显示任何错误或警告?这是GCC的错误吗?

c++ variables gcc anonymous

10
推荐指数
1
解决办法
265
查看次数

为什么左移一个负的有符号值是不明确的行为?

在一次采访中询问了这个问题.

<<负值左移具有未定义行为的原因是什么,而>>负数签名数的右移具有实现定义的行为

C11 $ 6.5.7:

第4段:

E1 << E2的结果是E1 左移 E2位位置; 腾出的位用零填充.如果E1具有无符号类型,则结果的值为E1 x 2 ^ E2,模数比结果类型中可表示的最大值减1.如果E1具有有符号类型和非负值,并且在结果类型中可以表示E1 x 2 ^ E2,那么这就是结果值; 否则,行为未定义.

第5段:

E1 >> E2的结果是E1 右移 E2位位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1/2 ^ E2的商的整数部分.如果E1具有带符号类型和负值,则结果值是实现定义的.

为什么左移一个负的有符号值是不明确的行为?

c bit-shift shift undefined-behavior language-lawyer

9
推荐指数
0
解决办法
1207
查看次数