以下两个代码片段之间是否存在任何最终差异?第一个为函数中的变量赋值,然后返回该变量.第二个函数只是直接返回值.
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) 情况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.
int mask = ~0;
Run Code Online (Sandbox Code Playgroud)
我已经打印了mask
C和C++ 的值.它总是打印-1
.
所以我确实有一些问题:
~0
要为掩码变量赋值?~0
什么?-1
而不是~0
吗?在下面的代码段,在函数调用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和C++语言中,该arr[i] = i++;
语句调用未定义的行为.为什么语句i = i + 1;
不会调用未定义的行为?
如果我们写下这样的话:
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
在我的代码中,
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
为什么在这两种情况下都是真的?
#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) 我std::valarray
在Nicolai M. Josuttis写的一本C++书中读过.他在他的书"C++标准库"第17.4章中写道:
valarray类的设计并不是很好.事实上,没有人试图确定最终规范是否有效.发生这种情况是因为没有人对这些课程感到"负责".在标准完成之前很久就将valarray引入C++标准库的人离开了委员会.因此,很少使用valarrays.
那么,使用std::valarray
哪个好主意?
我读了这个问题,解释了C++中匿名变量是如何无效的.
但是下面的程序在GCC 7.2上没有任何警告或错误编译(即使有-Wall
) - 演示:
int main() {
int (*); // anonymous variable?
}
Run Code Online (Sandbox Code Playgroud)
在这里,这显然也是一个整数类型的匿名变量.那么,为什么GCC没有显示任何错误或警告?这是GCC的错误吗?
在一次采访中询问了这个问题.
<<
负值左移具有未定义行为的原因是什么,而>>
负数签名数的右移具有实现定义的行为?
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具有带符号类型和负值,则结果值是实现定义的.
为什么左移一个负的有符号值是不明确的行为?