Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

4
在C / C ++中很久很久
我正在GNU的C ++编译器上尝试此代码,但无法理解其行为: #include <stdio.h>; int main() { int num1 = 1000000000; long num2 = 1000000000; long long num3; //num3 = 100000000000; long long num4 = ~0; printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3)); printf("%d %ld %lld %llu", num1, num2, num3, num4); return 0; } 当我取消注释注释行时,代码将无法编译并给出错误: 错误:整数常量对于长型而言太大 但是,如果代码按原样编译并执行,它将产生比10000000000大得多的值。 为什么?


9
为什么Math.pow(0,0)=== 1?
我们都知道0 0是不确定的。 但是,javascript说: Math.pow(0, 0) === 1 // true 和C ++说了同样的话: pow(0, 0) == 1 // true 为什么? 我知道: >Math.pow(0.001, 0.001) 0.9931160484209338 但是为什么不Math.pow(0, 0)抛出错误呢?也许aNaN会比1。

6
如何检查std :: thread是否仍在运行?
如何检查astd::thread是否仍在运行(以独立于平台的方式)?它缺少一种timed_join()方法,joinable()并不意味着要这样做。 我曾考虑过std::lock_guard在线程中使用a锁定互斥锁,并使用try_lock()互斥锁的方法来确定它是否仍处于锁定状态(线程正在运行),但是这对我来说似乎不必要。 您知道更优雅的方法吗? 更新:要明确:我想检查线程是否干净退出。为此,一个“挂起”线程被认为正在运行。


5
未定义的行为和顺序点已重新加载
将此主题视为以下主题的续集: 上一期文章 未定义行为和顺序点 让我们重新看一下这个有趣而令人费解的表达(斜体字词来自上面的主题* smile *): i += ++i; 我们说这会调用未定义的行为。我相信,当这样说,我们隐含假设型的i是内置的类型之一。 如果什么类型的i是用户定义类型?说它的类型是本文Index后面定义的类型(请参阅下文)。它仍然会调用未定义行为吗? 如果是,为什么?它不等于写作i.operator+=(i.operator++());,甚至在语法上更简单 i.add(i.inc());吗?或者,他们是否也调用未定义行为? 如果没有,为什么不呢?毕竟,对象在连续的序列点之间i被修改了两次。请回想一下经验法则:表达式只能在连续的“序列点”之间修改对象的值一次。如果 i += ++i是表达式,则它必须调用undefined-behavior。如果是,则它的等效项i.operator+=(i.operator++());也 i.add(i.inc());必须调用undefined-behavior,似乎是不正确的!(据我了解) 或者,i += ++i不是一开始的表达方式吗?如果是这样,那么它是什么,expression的定义是什么? 如果它是一个表达式,并且其行为也得到了很好的定义,则意味着与该表达式关联的序列点数在某种程度上取决于该表达式所涉及的操作数的类型。我是否正确(甚至部分正确)? 顺便说一下,这个表情怎么样? //Consider two cases: //1. If a is an array of a built-in type //2. If a is user-defined type which overloads the subscript operator! a[++i] = i; …

6
为什么需要std :: get_temporary_buffer?
我应该出于什么目的使用std::get_temporary_buffer?标准说: 获取一个足以存储最多n个相邻T对象的存储指针。 我以为缓冲区将在堆栈上分配,但这不是事实。根据C ++标准,此缓冲区实际上不是临时的。与全局函数相比,此函数有什么优势,全局函数::operator new也不构造对象。我对以下陈述是否等效? int* x; x = std::get_temporary_buffer<int>( 10 ).first; x = static_cast<int*>( ::operator new( 10*sizeof(int) ) ); 该功能仅存在于语法糖吗?为什么有temporary它的名字? 1996年7月1日在Dobb博士的日记中提出了一个用例来实现算法: 如果没有缓冲区可以分配,或者小于请求的缓冲区,则该算法仍然可以正常工作,只会减慢速度。

4
如何在C ++中为同一类定义不同的类型
我想有几种共享相同实现的类型,但在C ++中仍然是不同的类型。 为了用一个简单的例子说明我的问题,我想有一个针对Apple,Oranges和Bananas的类,它们都具有相同的操作和相同的实现。我希望它们具有不同的类型,因为由于类型安全,我想避免错误。 class Apple { int p; public: Apple (int p) : p(p) {} int price () const {return p;} } class Banana { int p; public: Banana (int p) : p(p) {} int price () const {return p;} } class Orange ... 为了不重复代码,看起来我可以使用基类Fruit并从中继承: class Fruit { int p; …
84 c++  types 

5
枚举vs强类型枚举
我是C ++编程的初学者。 今天,我遇到了一个新主题:强类型enum。我已经研究了一下,但是到现在为止我仍无法找出为什么我们需要它,以及它的用途是什么? 例如,如果我们有: enum xyz{a, b, c}; /*a = 0, b = 1, c = 2, (Typical C format)*/ 我们为什么需要写: enum class xyz{a, b, c}; 我们要在这里做什么?我最重要的疑问是如何使用它。您能否提供一个小例子,这会让我理解。
84 c++  c++11  enums 

1
具有指定模板参数的C ++ 11 make_pair无法编译
我只是在启用-std = c ++ 11的情况下玩g ++ 4.7(后面的快照之一)。我试图编译一些现有的代码库,而一个失败的案例使我有些困惑。 如果有人可以解释发生了什么,我将不胜感激。 这是代码: #include <utility> #include <iostream> #include <vector> #include <string> int main ( ) { std::string s = "abc"; // 1 ok std::pair < std::string, int > a = std::make_pair ( s, 7 ); // 2 error on the next line std::pair < …

2
std :: dynarray与std :: vector
C ++ 14提出了std::dynarray: std :: dynarray是一个序列容器,该容器封装大小固定在构造上的数组,并且在对象的整个生命周期中都不会改变。 std::dynarray必须与一样在运行时分配std::vector。 那么,std::dynarray可以使用的std::vector动态性更好(同时又可调整大小)的好处和用法是什么?
84 c++  stdvector 

1
强制转换运算符可以是显式的吗?
对于构造函数,添加关键字explicit可以防止热心的编译器在不是程序员的初衷时创建对象。这样的机制也可用于铸造操作员吗? struct Foo { operator std::string() const; }; 例如,在这里,我希望能够Foo转换为std::string,但是我不希望这种转换隐式发生。

7
如何从C调用C ++函数?
我知道这个。 从C ++调用C函数: 如果我的应用程序是C ++,并且必须从用C编写的库中调用函数,那么我会使用 //main.cpp extern "C" void C_library_function(int x, int y);//prototype C_library_function(2,4);// directly using it. 这不会破坏名称C_library_function,链接器将在其输入* .lib文件中找到相同的名称,从而解决了问题。 从C调用C ++函数??? 但是在这里,我扩展了一个用C编写的大型应用程序,我需要使用一个用C ++编写的库。C ++的名称修改在这里引起麻烦。链接器抱怨未解析的符号。好吧,我不能在我的C项目上使用C ++编译器,因为那打破了很多其他东西。出路是什么? 顺便说一句,我正在使用MSVC
84 c++  c  visual-c++  extern-c 

4
交叉初始化的迹象是什么?
考虑以下代码: #include <iostream> using namespace std; int main() { int x, y, i; cin >> x >> y >> i; switch(i) { case 1: // int r = x + y; -- OK int r = 1; // Failed to Compile cout << r; break; case 2: r = x …


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.