这种关系不等于明确定义的表达式吗?

时间:2017-07-18 10:01:03

标签: c++

考虑 dataGridView1.DataSource = dv; private void button1_Click(object sender, EventArgs e) { dv.RowFilter = "DocFirstName+' '+DocLastName like '" + textBox1.Text + "%'"; } } Foo的一个班级foo

Foo有一个函数calculate(),用于更改watermark()为“getter”的内部成员,并返回与该内部成员具有相同类型的内容。

是表达式

foo.calculate() != foo.watermark()

明确定义。也就是说,calculate()被调用之前必须watermark()吗?

按顺序说,评估顺序是严格foo.calculate(),然后是foo.watermark(),后跟!=

3 个答案:

答案 0 :(得分:4)

两者之间没有连续点,评估顺序未指定。

您必须强制执行序列,例如:

const auto& res = foo.calculate();
res != foo.watermark();

答案 1 :(得分:3)

C ++标准(ISO / IEC 14882:2014)说:

  

之前排序的是不对称,传递,成对关系   由单个线程执行的评估之间,导致a   这些评估中的部分顺序。鉴于任何两个评估A和   B,如果A在B之前排序,那么A的执行应该先于   执行B. 如果A在B之前没有排序,B则不排序   在A之前排序,然后A和B未被排序。评估A和   当A或B在B或之前测序时,B是不确定的测序   B在A之前排序,但未指定哪个。

不允许相同的标量对象出现在未经测序或不确定顺序操作的两半中的副作用或值计算中。

参考链接here

答案 2 :(得分:0)

这可能会有所帮助:http://en.cppreference.com/w/cpp/language/eval_order

  

几乎所有C ++运算符的操作数的评估顺序(包括函数调用表达式中函数参数的评估顺序以及任何表达式中子表达式的评估顺序)都未指定。编译器可以按任何顺序计算操作数,并且可以在再次计算同一表达式时选择另一个顺序。