考虑以下代码:
int func1()
{
cout<<"Plus"<<endl;
return 1;
}
int func2()
{
cout<<"Multiplication"<<endl;
return 2;
}
int main()
{
cout<<func1()+4*func2();
}
Run Code Online (Sandbox Code Playgroud)
根据这个页面*运算符的优先级高于+运算符所以我希望结果是:
Multiplication
Plus
9
Run Code Online (Sandbox Code Playgroud)
但结果是
Plus
Multipication
9
Run Code Online (Sandbox Code Playgroud)
!编译器解析器发生了什么?编译器是否更喜欢操作员关联?所有c/c ++编译器中的输出是否相同?
我用下面的代码比较std::list有std::forward_list
#include <iostream>
#include <list>
#include <forward_list>
#include <windows.h>
int main()
{
LARGE_INTEGER start_;
LARGE_INTEGER end_;
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
std::list<long long> list;
QueryPerformanceCounter(&start_);
for(long long i=0;i<50000000;i++)
list.push_front(i);
QueryPerformanceCounter(&end_);
std::cout<< (end_.QuadPart - start_.QuadPart) / (freq.QuadPart / 1000) <<"\n";
cin.get();
}
Run Code Online (Sandbox Code Playgroud)
我改了名单forward_list .测量结果的时间和大小:
//long long
// size time
//forward list 1157.3 2360
//list 1157.3 2450
Run Code Online (Sandbox Code Playgroud)
我也为此代码做了同样的事情:
int main()
{
LARGE_INTEGER start_;
LARGE_INTEGER end_;
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
std::list<char> list;
QueryPerformanceCounter(&start_);
for(long long i=0;i<50000000;i++)
list.push_front('a');
QueryPerformanceCounter(&end_);
std::cout<< (end_.QuadPart - start_.QuadPart) …Run Code Online (Sandbox Code Playgroud) 以下不用(GCC)4.8.2编译.它抱怨这样:
错误:没有匹配函数来调用'classderivedderived :: dump(int)'
#include <iostream>
class classbase{
public:
void print() {std::cout << "base\n";}
virtual void dump() = 0;
void dump(int i) {std::cout << i << " blech\n";}
int i;
};
class classderived : public classbase {
public:
int ii;
};
class classderivedderived : public classderived {
public:
void dump() {std::cout << "blah\n"; dump(10);}
int iii;
};
int main() {
classderivedderived yellow;
yellow.i = 5;
yellow.dump();
}
Run Code Online (Sandbox Code Playgroud)
它确实编译并运行
(1) dump(10) => classbase::dump(10)
要么
(2) dump(10) => puddledump(10) and void dump(int …
我正在编写一个计算多维向量元素的函数
template<class T>
int real_size(const std::vector<T>& vec)
{
int size=0;
for(const auto& v : vec)
{
if(std::is_integral<T>::value ||
std::is_floating_point<T>::value){
size+=1;
}
else{
size +=real_size(v);
}
}
return size;
}
int main()
{
std::vector<std::vector<int>> a(10);
a[0]=std::vector<int>(10);
std::cout<<real_size(a);
}
Run Code Online (Sandbox Code Playgroud)
哪给我这些错误:
error: no matching function for call to 'real_size(const int&)'
size +=real_size(v);
^
Run Code Online (Sandbox Code Playgroud)
这段代码看起来很好,错误也无关紧要...... else语句永远不会成为size +=real_size(int);因为我正在检查模板参数的类型std::is_integer.
但似乎编译器在编译时无法理解它!它是编译器错误还是我犯了错误?
*我正在使用gcc 4.8.1.g ++ -std = c ++ 11*
我想知道为什么这段代码打印相同的成员地址不同:
template <typename FI>
void sorta(FI begin, FI end){
using T = typename std::iterator_traits<FI>::value_type;
std::sort(begin, end, [](const T& lhs,const T& rhs){
std::cout << lhs<<"**"<<&lhs << '\n';
return std::rand()%2;
});
}
int main()
{
std::vector<int> a{1,5,3,4,7};
sorta(a.begin(),a.end());
}
Run Code Online (Sandbox Code Playgroud)
可能的输出:
5**0x25e5014
3**0x25e5018
3**0x7fff93d5d3e0
...
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,变量3的地址在每个函数调用中都是不同的!
看起来很奇怪我尝试了一个简单的函数,它做了类似std :: sort的事情:
using Iterator=std::vector<int>::iterator;
template<class Func>
void foo(Iterator begin,Iterator end,Func f)
{
for(Iterator it=begin; it != end-1;++it)
{
auto f2=[&begin,&f](int& lhs,int& rhs){
std::cout<<&(*begin)<<"\n"<<&lhs<<" "<<&rhs;
f(lhs,rhs);
};
f2(*it,*(it+1));
}
}
int main()
{
std::vector<int> a{1,5,3,4,7};
foo(a.begin(),a.end(),[](int& …Run Code Online (Sandbox Code Playgroud) 我想删除元素std::forward_list并将其插入列表的开头但是没有插入方法......它只是insert_after!
如何在开头插入元素std::forward_list?
double testpower;
testpower = pow(400,-9);
Run Code Online (Sandbox Code Playgroud)
testpower给我3.8146972656250003e-024哪个是不同的计算器输出4E-7
任何人都知道为什么?
c++ ×7
c++11 ×5
forward-list ×2
stl ×2
c ×1
gcc ×1
inheritance ×1
lambda ×1
list ×1
math ×1
optimization ×1
pow ×1
sorting ×1
templates ×1