奇怪的C ++语法?

时间:2012-07-02 20:16:43

标签: c++ syntax

这可能是一个愚蠢的问题,但我有一行代码如下:

Solver *S, *STP = S = 
UseDummySolver ? createDummySolver() : new STPSolver(true);

我知道三元运算符,但它等于让我感到困惑的等号。谁能给我一些解释?感谢。

5 个答案:

答案 0 :(得分:16)

写出来,是

Solver *S;
Solver *STP;
S = UseDummySolver ? createDummySolver() : new STPSolver(true);
STP = S;

虽然这很丑陋,但我不建议你在代码中这样做。

推荐的方法是按如下方式编写它(使用初始化,而不是赋值):

Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true);
Solver *STP = S;

答案 1 :(得分:6)

我建议这样做:

Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true);
Solver *STP = S;

它简洁,整洁,干净。

此外,它使用初始化,而不是赋值。您应该尽可能优先进行初始化而不是分配。

答案 2 :(得分:5)

你正在看链式作业。

与以下内容相同:

Solver *S;
Solver *STP;
S = UseDummySolver ? createDummySolver() : new STPSolver(true);
STP = S;

答案 3 :(得分:2)

三元运算符返回一个值;基于UseDummySolver布尔值,它返回虚拟解算器或返回STPSolver()的新实例。然后将此返回值存储在STPS

答案 4 :(得分:0)

我更喜欢这个:

std::unique_ptr<Solver> S (  UseDummySolver
                                  ? createDummySolver()
                                  : new STPSolver(true)  );
Solver& STP = *S;

或者这个:

std::shared_ptr<Solver> S (  UseDummySolver
                                  ? createDummySolver()
                                  : new STPSolver(true)  );
std::shared_ptr<Solver> STP = S;

两者都避免了你遇到的代码的一个问题:当对象离开范围时,我们不需要确定调用delete的指针(或者,实际上,记住需要调用{完全{1}}。相反,我们只是等到变量离开范围,然后自动删除delete对象。 Solver在第一种情况下只是另一种访问对象的方式,当它在范围内时,在第二种情况下,它是对象的独立“共同所有者”,并且两个指针都可以独立地重新分配。