Questions tagged «c++-faq»

提供协作式,社区编辑的C ++常见问题解答


7
启用优化的不同浮点结果-编译器错误?
以下代码在经过优化和未经优化的情况下均适用于Visual Studio 2008。但是,它仅适用于未经优化(O0)的g ++。 #include <cstdlib> #include <iostream> #include <cmath> double round(double v, double digit) { double pow = std::pow(10.0, digit); double t = v * pow; //std::cout << "t:" << t << std::endl; double r = std::floor(t + 0.5); //std::cout << "r:" << r << std::endl; return r / …
109 c++  optimization  g++  c++-faq 

4
什么是透明比较器?
在C ++ 14中,关联容器似乎已从C ++ 11进行了更改– [associative.reqmts] / 13说: 成员函数模板find,count,lower_bound,upper_bound,并且equal_range不得,除非类型参与重载决议Compare::is_transparent存在。 使比较器“透明”的目的是什么? C ++ 14还提供了如下库模板: template <class T = void> struct less { constexpr bool operator()(const T& x, const T& y) const; typedef T first_argument_type; typedef T second_argument_type; typedef bool result_type; }; template <> struct less<void> { template <class T, class U> …
106 c++  c++14  c++-faq 

3
为什么std :: getline()在格式化提取后会跳过输入?
我有以下代码提示用户输入名称和状态: #include <iostream> #include <string> int main() { std::string name; std::string state; if (std::cin >> name && std::getline(std::cin, state)) { std::cout << "Your name is " << name << " and you live in " << state; } } 我发现该名称已成功提取,但状态尚未提取。这是输入和结果输出: Input: "John" "New Hampshire" Output: "Your name is John and …
105 c++  input  iostream  istream  c++-faq 

3
为什么简单的“ Hello World”风格的程序不能用Turbo C ++编译?
我已经开始为编程课学习C ++。我已经下载了这个“ Hello World”程序: #include <iostream> using namespace std; int main() { cout << "Hello, World!"; return 0; } 但是Turbo C ++抱怨: Error D:\HELLO.CPP 1: Unable to open include file 'IOSTREAM' Error D:\HELLO.CPP 2: Declaration syntax error Error D:\HELLO.CPP 6: Undefined symbol 'cout' 这个非常简单的程序有什么问题?我该如何纠正这些错误?
101 c++  turbo-c++  c++-faq 

4
cout << a ++ << a;的正确答案是什么?
最近在一次采访中,出现了以下客观类型问题。 int a = 0; cout &lt;&lt; a++ &lt;&lt; a; 答案: 一个。10 羽 01 c。未定义的行为 我回答了选项b,即输出为“ 01”。 但是令我惊讶的是,一位面试官告诉我,正确的答案是选项c:未定义。 现在,我知道C ++中序列点的概念。对于以下语句,该行为是未定义的: int i = 0; i += i++ + i++; 但按我的理解的声明cout &lt;&lt; a++ &lt;&lt; a中,ostream.operator&lt;&lt;()将被称为两次,第一次以ostream.operator&lt;&lt;(a++)后来ostream.operator&lt;&lt;(a)。 我还在VS2010编译器上检查了结果,其输出也为'01'。
98 c++  c++-faq 

17
函数指针的意义是什么?
我很难看到函数指针的实用程序。我猜它在某些情况下可能是有用的(毕竟它们确实存在),但是我无法想到使用函数指针更好或不可避免的情况。 您能否举出一些很好使用函数指针的示例(在C或C ++中)?
94 c++  c  function  pointers  c++-faq 

16
C ++中循环移位(旋转)操作的最佳实践
左和右移位运算符(&lt;&lt;和&gt;&gt;)已经在C ++中可用。但是,我找不到如何执行循环移位或旋转操作的方法。 如何执行“向左旋转”和“向右旋转”之类的操作? 在这里向右旋转两次 Initial --&gt; 1000 0011 0100 0010 应导致: Final --&gt; 1010 0000 1101 0000 一个例子会有所帮助。 (编者注:如果C的旋转数为零,或者编译成多个旋转机械指令,则许多用C表示旋转的常见方法都会遭受不确定的行为。此问题的答案应记录最佳实践。)

2
除运算符优先级外,什么时候附加括号什么时候起作用?
C ++中的括号在许多地方使用:例如,在函数调用和分组表达式中,以覆盖运算符优先级。除了非法的多余括号(例如在函数调用参数列表周围)之外,C ++的一个通用而非绝对规则是,多余的括号永远不会损害: 5.1主表达式[expr.prim] 5.1.1常规[expr.prim.general] 6带括号的表达式是一个主表达式,其类型和值与附带的表达式相同。括号的存在不影响表达式是否为左值。除非另有说明,否则带括号的表达式可以在与可以使用封闭表达式的上下文完全相同的上下文中使用,并且具有相同的含义。 问题:除了覆盖基本的运算符优先级以外,多余的括号还会在哪些上下文中更改C ++程序的含义? 注意:我认为指针到成员语法的限制(&amp;qualified-id不带括号)不在范围内,因为它限制了语法,而不是允许两种具有不同含义的语法。同样,在预处理程序宏定义中使用括号也可以防止不必要的运算符优先级。

2
派生类中具有相同名称但签名不同的函数
我有一个同名的函数,但在基类和派生类中具有不同的签名。当我尝试在继承自派生类的另一个类中使用基类的函数时,收到错误消息。请参阅以下代码: class A { public: void foo(string s){}; }; class B : public A { public: int foo(int i){}; }; class C : public B { public: void bar() { string s; foo(s); } }; 我从gcc编译器收到以下错误: In member function `void C::bar()': no matching function for call to `C::foo(std::string&amp;)' candidates are: …

3
“假设”规则到底是什么?
如标题所示, “假设”规则到底是什么? 一个典型的答案是: 允许任何和所有代码转换而不会改变程序可观察行为的规则 我们会不时地从某些实现中获得归因于该规则的行为。很多次是错误的。所以,这条规则到底是什么。该标准没有明确提及该规则的一部分或段落,那么该规则的作用范围到底是什么?对我来说,这似乎是一个灰色区域,该标准未对其进行详细定义。有人可以引用标准的参考文献来详细说明细节吗? 注意:将此标记为C和C ++,因为它与两种语言都相关。
89 c++  c  optimization  c++-faq  as-if 

5
将共享指针作为参数传递
如果我声明一个包装在共享指针中的对象: std::shared_ptr&lt;myClass&gt; myClassObject(new myClass()); 然后我想将其作为方法的参数传递: DoSomething(myClassObject); //the called method void DoSomething(std::shared_ptr&lt;myClass&gt; arg1) { arg1-&gt;someField = 4; } 上面是否只是简单地增加了shared_pt的引用计数,并且一切都很酷?还是留下一个悬空的指针? 您仍然应该这样做吗?: DoSomething(myClassObject.Get()); void DoSomething(std::shared_ptr&lt;myClass&gt;* arg1) { (*arg1)-&gt;someField = 4; } 我认为第二种方法可能更有效,因为它只需要复制1个地址(而不是整个智能指针),但是第一种方法似乎更具可读性,并且我预计不会出现性能限制。我只想确保它没有危险。 谢谢。



1
gcc / g ++:“没有这样的文件或目录”
g++ 给我以下形式的错误: foo.cc:&lt;line&gt;:&lt;column&gt;: fatal error: &lt;bar&gt;: No such file or directory compilation terminated. 使用编译C程序时相同gcc。 这是为什么? 请注意:这个问题已经被问过很多次了,但是每次都针对询问者的情况。这个问题的目的是要提出一个问题,即其他人可以作为的复制品一劳永逸地关闭;一个常见问题。
87 c++  c  gcc  g++  c++-faq 

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.