相关疑难解决方法(0)

不明确的运算符优先级,请解释为什么运算符在这里没有遵循?

x = y = z = 1;
z = ++x||++y&&++z;
Run Code Online (Sandbox Code Playgroud)

运算符优先级如下 -

(pre-increment) > && > ||
Run Code Online (Sandbox Code Playgroud)

所以回答应该是 -

1.  2||2 && 2
2.  2||1
3.  1

print x,y,z should be 2,2,1
Run Code Online (Sandbox Code Playgroud)

但是,答案是2,1,1.

c

4
推荐指数
2
解决办法
472
查看次数

C++一元右折与一元左折与逗号运算符

为什么逗号分隔的一元左折产生与右一折相同的结果?

实时代码

template<class ...Args>
void right_fold(Args... args){
    ((std::cout << args),...);
}

template<class ...Args>
void left_fold(Args... args){
    (...,(std::cout << args));
}

int main()
{
    right_fold(1,2,3,4);
    std::cout << std::endl;
    left_fold(1,2,3,4);
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

1234
1234
Run Code Online (Sandbox Code Playgroud)

不应该是:

4321
1234
Run Code Online (Sandbox Code Playgroud)

c++ fold-expression c++17

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

运算符重载C++ - 重载输出"<<"运算符

我刚刚开始学习基本的C++语法,我对我遇到的一段代码感到有些困惑.

对于一个名为MyString的类,有一个运算符重载定义为:

ostream& operator<<(ostream& os, const MyString& s)
{
    os << s.data;
    return os;
}
Run Code Online (Sandbox Code Playgroud)

然后在一些驱动函数中声明:

cout << s3 << endl;
Run Code Online (Sandbox Code Playgroud)

运行,其中s3是对象类型MyString.结果打印出s3的值.

我不太明白这个陈述是如何起作用的.在搞乱之后,似乎只需要调用一次复制构造函数,然后解构3个对象.这条线的确如何运作?看起来操作符接受对ostream和MyString的引用,但是它既不是endl也不是endl?另外,为什么在使用"<<"的两个实例时只调用一个复制构造函数呢?也许我甚至没有问正确的问题,或者我的问题甚至没有意义,因为我对这些问题的发生感到非常困惑.如果是这种情况,有人可以解释一下对正在发生的事情的一般性解释吗?

c++ operator-overloading

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

快速优化

我正在学习排序算法,下一步,我试图让我的实现执行接近std::sort().我到目前为止很远...... :-)

我有3个quicksort实现:

  • 标准快速排序(使用临时数组).
  • 快速排序,具有以下优化:
    • median3用于选择中位数
    • 尾递归
    • quicksort仅适用于分区大小<16.对于较小的分区,使用插入排序.
    • 插入排序一次应用于整个数组,而不是应用于每个分区,由quicksort保留未排序.
  • 快速排序,包含上面列出的所有优化+就地分区(无临时数组).

我预计性能最好是自下而上,但最好自上而下!

我的实施有什么问题?鉴于性能之间的巨大差异,我认为存在一些完全错误.

一些数字让你感觉到有多糟糕(N =数组中的元素数量,数字是每个算法所用的时间,以微秒为单位):排序vector<int>和每个算法都给出了完全相同的数字序列.

N           quick       mixed       mixed_inplace
8           0           0           0
16          0           1           1
32          1           2           2
64          1           3           3
128         1           8           8
256         3           16          17
512         6           34          41
1,024       16          84          87
2,048       28.3        177.1       233.2
4,096       48.5        366.6       410.1
8,192       146.5       833.5       1,012.6
16,384      408.4       1,855.6     1,964.2
32,768      1,343.5     3,895.0     4,241.7
65,536      2,661.1     7,927.5     8,757.8
Run Code Online (Sandbox Code Playgroud)

使用Visual Studio …

c++ sorting algorithm optimization quicksort

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

C中的后增量和前增量

可能重复:
任何人都可以解释这些未定义的行为(i = i ++ + ++ i,i = i ++等...)

下面有一个代码,我在理解代码的逻辑时遇到了一个非常严重的问题.

#include <stdio.h>
#include <stdlib.h>

int main(void )
{
int i = 1 ;
printf("\n%d %d %d %d\n",++i,i++,i++,++i) ;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

我在linux发行版下使用名为Mandriva的gcc编译器.在上面提到的我在printf语句中使用了一个变量的pre和post增量.我应该得到的输出是2 2 3 5,但我得到一个不同的输出.请帮我这个代码.

我觉得这段代码很难.

c

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

运营商的优先顺序?

看看这个简单的类:

class A {
    int *val;
public:
    A() { val = new int; *val = 0; }
    int get() { return ++(*val); }
};
Run Code Online (Sandbox Code Playgroud)

为什么当我运行此代码时它会打印21:

int main() {
    A a, b = a;
    cout << a.get() << b.get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但如果我像这样运行它打印12出的是我所期待的:

int main() {
    A a, b = a;
    cout << a.get();
    cout << b.get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?运算符优先级?仅供参考,这是一个C++测试问题,而不是生产代码.

编辑: 它意味着,当我cout << (Expr1) << (Expr2)然后Expr1Expr2被输出之前评估Expr1印刷?

c++ operator-precedence

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

C++:*(乘法)运算符的关联性不是从左到右

在完成学校作业时,我们不得不对操作员重载和模板做些什么.一切都很酷.我写:

template<class T>
class Multiplication : public Expression<T>
{
private:
        typename std::shared_ptr<Expression<T> > l, r;

public:
        Multiplication(typename std::shared_ptr<Expression<T> > l, typename std::shared_ptr<Expression<T> > r) : l(l), r(r) {};
        virtual ~Multiplication() {};

        T evaluate() const
        {
                std::cout << "*";
                T ml = l->evaluate();
                T mr = r->evaluate();
                return ml * mr;
        };
};
Run Code Online (Sandbox Code Playgroud)

然后一位朋友问我为什么他的代码以"错误"的顺序产生输出.他有类似的东西

T evaluate() const
{
        std::cout << "*";
        return l->evaluate() * r->evaluate();
};
Run Code Online (Sandbox Code Playgroud)

r->evaluate()之前打印调试信息的代码l->evaluate().我也在我的机器上进行了测试,只需将这三条线改为单线.

所以,我想,那么*应该是从右到左的联想.但在互联网上,他们说这是从左到右.有一些额外的规则吗?使用模板时可能有些特别之处?或者这是VS2012中的错误?

c++ operator-overloading associativity operator-keyword

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

增量和逻辑运算符优先级

在下面显示的程序中,应首先评估前缀,因为它具有更高的优先级,但是答案是-2, 2, 0, 1并且在书中解释"因为||的LHS是真的,RHS未被评估".
为什么会这样?应首先执行所有增量,然后由于优先级检查逻辑.

#include<stdio.h>

int main()
{
    int i=-3, j=2, k=0, m;
    m = ++i || ++j && ++k;
    printf("%d, %d, %d, %d\n", i, j, k, m);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c pre-increment

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

C++函数中非常奇怪的优先级/优先级

为什么以下打印出"World Hello!"?

根据我的理解,根据运算符优先级,这应该从右边开始评估.但相反,从左到右似乎是正确的.为什么是这样?

#include <iostream>

using namespace std;


char print() {
    cout << "World";
    return '!';
}

int main() {
    cout << "Hello " << print() << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ operator-precedence

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

GCC三元条件运算符的副作用与值计算?


我有以下代码会对我产生意外的结果:

 #include < stdio.h >

int a = 0, value;

int main(void)
{
    // Testing the evaluation order of multiple
    // conditional operators:
    value = (a == 3) ? 3 : (a = 3) ? 5 : 0;
    printf("%d\n", value);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望此代码能打印3,因为条件运算符的计算
从右到左,并且在?处有一个序列点。先执行
操作的结果,而实际上会打印出5。
假定表达式
的值是时,假设还计算了两个序列点之间的表达式的副作用,是否错误?
如果我添加printf(“%d \ n” a); 我虽然打印了3张,但副作用得到了解决。
还是只是控制剂量确实传递给了子表达式,其值
被正式“首次”计算?
我宁愿押注后者,因为将'a'的值更改为3并将右值
将第二个条件条件赋值为4导致
第一个条件表达式进行短路评估,这意味着我同时为“ a”和“ value”打印了3个值。
我使用-std = c99标志在带有GCC 4.8.2的Lubuntu 14.04上获得了上述结果。
感谢您让我澄清此事!

c gcc

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

在IF语句中读写变量

我希望在单个IF语句中执行以下步骤以节省代码编写:

如果retTRUE,则设置ret为函数的结果lookup().如果ret是,现在FALSE,打印错误消息.

我写的代码如下:

BOOLEAN ret = TRUE;

// ... functions assigning to `ret`

if ( ret && !(ret = lookup()) )
{
    fprintf(stderr, "Error in lookup()\n");
}
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,这并不像它看起来那么简单.在IF语句中读取,分配和读取同一变量.据我所知,编译器将始终根据优先级将这样的语句拆分为组成操作,并一次评估一个合并,在将操作数评估为false时立即失败,而不是全部评估它们.如果是这样,那么我希望代码遵循我上面写的步骤.

我已经在IF语句中使用了很多作业,我知道它们可以正常工作,但事先没有另外读过.

有什么理由说这不是好代码吗?就个人而言,我认为它易于阅读且含义清晰,我只是担心编译器可能因为某种原因而无法生成等效逻辑.也许编译器供应商的差异,优化或平台依赖可能是一个问题,但我对此表示怀疑.

c++

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

三元运算符的PHP错误?

function foo() {
    return $result = bar() ? $result : false;
}

function bar() {
    return "some_value";
}

foo();
Run Code Online (Sandbox Code Playgroud)

注意:未定义的变量:结果

这是一个错误吗?

bar()应该保存到$ result,但它不会.但是条件工作正常并且它试图返回$ result或false语句(如果bar()为NULL或false)

PHP 5.4.24

php ternary operator-keyword

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

为什么printf不在这里打印?

我知道执行后的printf返回一些非零值{编辑:返回否.charecters}现在在这个例子中我使用了多个printf和现在.

 /* As far as i was cocerned Precedence of && is more than ||,
  *and these logical operators check from left to right  
  *So compiler should come to hello and print "hello" then "nice to see you" then "hie" 
  *as all are true it should print "hola" 
  *but i wonder, why here the output is only "hie" and "hola"?
  */  

 #include<stdio.h>
 main()
 {
    if(printf("hie")|| printf("hello")&& printf("nice to see you"))
    printf("\thola\n");
 }
Run Code Online (Sandbox Code Playgroud)

c c++ printf

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