假设我们有一个T myarray[100]
带有T = int,unsigned int,long long int或unsigned long long int,将所有内容重置为零的最快方法是什么(不仅用于初始化,而且在我的程序中多次重置内容) ?也许有memset?
像动态数组一样的问题T *myarray = new T[100]
.
在检查另一个问题的引用时,我注意到C++ 11中的一个奇数子句,在[expr.rel]3:
指针
void
(后指针转化)可以进行比较,以确定其结果如下:如果两个指针表示相同的地址或均为空指针值,其结果是true
,如果操作者<=
或>=
与false
其他方式; 否则结果未指定.
这似乎意味着,一旦两个指针被投入void *
,它们的排序关系就不再有保证; 例如,这个:
int foo[] = {1, 2, 3, 4, 5};
void *a = &foo[0];
void *b = &foo[1];
std::cout<<(a < b);
Run Code Online (Sandbox Code Playgroud)
似乎没有具体说明.
有趣的是,这个子句在C++ 03中不存在并且在C++ 14中消失了,所以如果我们采用上面的例子并应用C++ 14的措辞,我会说3.1
- 如果两个指针指向同一数组的不同元素或其子对象,则指向具有较高下标的元素的指针比较大.
将应用,作为a
并b
指向同一数组的元素,即使它们已被转换为void *
.请注意,3.1的措辞在C++ 11中几乎完全相同,但似乎被该void *
子句覆盖了.
我的理解是对的吗?在C++ 11中添加并立即删除的奇怪子句有什么意义?或者它可能仍然存在,但是被标准的其他部分移动/隐含?
在我的GCC测试程序中,NULL似乎为零,但维基百科说NULL
只需指向无法寻址的内存.
有没有编译器NULL
非零?我很好奇是否if (ptr == NULL)
更好的做法if (!ptr)
.
当我浏览cppreference时,我在函数参数中看到了一个奇怪的类型数组,如下所示:
void f(double x[volatile], const double y[volatile]);
Run Code Online (Sandbox Code Playgroud)
那么,volatile
关键字出现在数组下标中的目的是什么?它有什么作用?
我想在两个单独的.c文件中编写我的C函数,并使用我的IDE(Code :: Blocks)将所有内容编译在一起.
如何在Code :: Blocks中设置它?
如何.c
从另一个文件中调用一个文件中的函数?
当这不能在C中编译时我很困惑:
int main()
{
for (int i = 0; i < 4; ++i)
int a = 5; // A dependent statement may not be declaration
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经习惯了将要编译的C++.我只是愣了一会儿,直到我记得这里的答案是关于如何在C和C++中将不同的东西视为"陈述".这是关于switch语句的.for循环括号后面的"语句"必须同时出现在C和C++中.这可以在添加分号或创建{}波浪形支架块的情况下完成.
在C++中"int a = 7;" 被视为声明,定义和初始化.CI认为它也被认为是所有这些,但在C中它不被视为"声明".
有人可以准确地澄清为什么在C中这不是一个陈述,而在C++中它是?这让我对一个陈述的概念感到困惑,因为一种语言说的是,而另一种语言则说不是,所以我有点困惑.
如果你忘记了软件包末尾的1,Perl会告诉你"软件包没有返回真值".好吧,如果它知道你忘了它,为什么不把它放在那里呢?
在C++ 11中,如果复制和移动赋值都可用,则编译器会在参数为左值时自动选择复制赋值,如果是左值则移动赋值.使用std::move
它可以明确地选择左值的移动分配.但是如何明确选择rvalue的复制赋值呢?
代码示例:
#include <iostream>
class testClass
{
public:
testClass &operator=(const int &other) {
std::cout << "Copy assignment chosen." << std::endl;
return *this;
}
testClass &operator=(int &&other) {
std::cout << "Move assignment chosen." << std::endl;
return *this;
}
};
int main(int argc, char *argv[])
{
int a = 4;
testClass test;
test = a; // Selects copy assignment
test = 3; // Selects move assignment
test = std::move(a); // Selects move assignment
// test = std::copy(3); // <--- …
Run Code Online (Sandbox Code Playgroud) 使用ShellExecute文档作为参考:
我从命令行运行以下命令:
C:\>RUNDLL32.EXE SHELL32.DLL,ShellExecute handle,"open","C:\Documents and Settings\admin\Desktop\tmp",NULL,NULL,SW_SHOWNORMAL
Run Code Online (Sandbox Code Playgroud)
这会导致异常错误.
我不知道这意味着什么:
HINSTANCE ShellExecute(
__in_opt HWND hwnd,
__in_opt LPCTSTR lpOperation,
__in LPCTSTR lpFile,
__in_opt LPCTSTR lpParameters,
__in_opt LPCTSTR lpDirectory,
__in INT nShowCmd
);
Run Code Online (Sandbox Code Playgroud)
但是在描述中,提到了句柄(HWND)和指向以空字符结尾的字符串(LPCTSTR)的指针,但它非常混乱.
任何帮助将不胜感激.我还想了解更多,所以任何参考(书籍,网络链接等)也会很棒!
对于某些任务,通常需要多个具有明确释放资源的对象 - 例如,两个文件; 当任务是使用嵌套with
块的函数的本地任务时,这很容易完成,或者 - 甚至更好 - with
具有多个with_item
子句的单个块:
with open('in.txt', 'r') as i, open('out.txt', 'w') as o:
# do stuff
Run Code Online (Sandbox Code Playgroud)
OTOH,当这些对象不仅仅是函数作用域的本地对象,而是由类实例拥有 - 换句话说,上下文管理器如何构成时,我仍然很难理解它应该如何工作.
理想情况下,我想做的事情如下:
class Foo:
def __init__(self, in_file_name, out_file_name):
self.i = WITH(open(in_file_name, 'r'))
self.o = WITH(open(out_file_name, 'w'))
Run Code Online (Sandbox Code Playgroud)
并有Foo
自己变成上下文管理,处理i
和o
,这样,当我做
with Foo('in.txt', 'out.txt') as f:
# do stuff
Run Code Online (Sandbox Code Playgroud)
self.i
并self.o
按照您的预期自动处理.
我修改了写东西,比如:
class Foo:
def __init__(self, in_file_name, out_file_name):
self.i = open(in_file_name, 'r').__enter__()
self.o = open(out_file_name, 'w').__enter__()
def __enter__(self):
return …
Run Code Online (Sandbox Code Playgroud) c ×5
c++ ×4
arrays ×2
c++11 ×2
codeblocks ×1
if-statement ×1
memset ×1
null ×1
perl ×1
perl-module ×1
pointers ×1
python ×1
return-value ×1
rundll32 ×1
volatile ×1