小编LxL*_*LxL的帖子

运算符优先级在c ++中的行为不符合预期

考虑以下代码:

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 ++编译器中的输出是否相同?

c c++ operator-precedence c++11

1
推荐指数
2
解决办法
394
查看次数

为什么使用带有char的forward_list比使用long long更优化?

我用下面的代码比较std::liststd::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)

c++ optimization list c++11 forward-list

1
推荐指数
1
解决办法
357
查看次数

g ++在基类中找不到重载函数

以下不用(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 …

c++ inheritance gcc

1
推荐指数
1
解决办法
610
查看次数

为什么编译器在编译时无法理解if branch的值?

我正在编写一个计算多维向量元素的函数

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*

c++ templates c++11

1
推荐指数
1
解决办法
178
查看次数

为什么std :: vector的相同成员的地址在std :: sort的比较函数中是不同的?

我想知道为什么这段代码打印相同的成员地址不同:

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)

c++ sorting lambda stl c++11

1
推荐指数
1
解决办法
190
查看次数

在std :: forward_list的开头插入元素

我想删除元素std::forward_list并将其插入列表的开头但是没有插入方法......它只是insert_after!

如何在开头插入元素std::forward_list

c++ stl c++11 forward-list

0
推荐指数
1
解决办法
456
查看次数

C++ pow(400,-9)给出了错误的答案

double testpower;

testpower = pow(400,-9);
Run Code Online (Sandbox Code Playgroud)

testpower给我3.8146972656250003e-024哪个是不同的计算器输出4E-7

任何人都知道为什么?

c++ math pow

-6
推荐指数
1
解决办法
151
查看次数