C++ de>c将绑定到*,表达式将被解析为a+(b*c)
求值顺序规则:它描述如何在表达式中求值操作数。在声明中C++ de>c将绑定到*,表达式将被解析为a+(b*c),c++,c,language-lawyer,C++,C,Language Lawyer,求值顺序规则:它描述如何在表达式中求值操作数。在声明中 d = a>5 ? a : ++a; a保证在评估++b或c之前进行评估 但是对于表达式a+(b*c),尽管*的优先级高于+,但不能保证a将在b或c之前或之后进行求值,甚至不会为其求值排序b和c。即使是a、b和c也可以按任意顺序计算 简单的规则是:运算符优先级独立于求值顺序,反之亦然。 在表达式i=i++code>,更高的优先级+只告诉编译器使用+++/code>操作符绑定i并进行绑定,就这样。它没有说明操作数的求值顺序,也没有
d = a>5 ? a : ++a;
a
保证在评估++b
或c
之前进行评估但是对于表达式
a+(b*c)
,尽管*
的优先级高于+
,但不能保证a
将在b
或c
之前或之后进行求值,甚至不会为其求值排序b
和c
。即使是a
、b
和c
也可以按任意顺序计算
简单的规则是:运算符优先级独立于求值顺序,反之亦然。
在表达式i=i++code>,更高的优先级+
只告诉编译器使用+++/code>操作符绑定i
并进行绑定,就这样。它没有说明操作数的求值顺序,也没有说明应该首先发生哪些副作用(由=
运算符产生的副作用或由+
产生的副作用)。编译器可以自由地做任何事情
让我们将赋值左侧的i
重命名为il
,将赋值右侧的i++
表达式重命名为ir
,然后表达式如下
il = ir++ // Note that suffix l and r are used for the sake of clarity.
// Both il and ir represents the same object.
现在编译器可以自由地计算表达式il=ir++
,如下所示:
temp = ir; // i = 0
ir = ir + 1; // i = 1 side effect by ++ before assignment
il = temp; // i = 0 result is 0
或
产生两种不同的结果0
和1
,这取决于分配和++
的副作用顺序,因此调用UB 这个问题不是重复的。它询问序列点和优先级之间的差异,这在你提到的帖子中没有得到回答。这不是重复:即使问题的设置是相同的,OP想知道一些完全不同的东西(即,为什么编译器应用优先级规则不能解决此问题)。投票重新打开。i++
的值是递增之前的i
的旧值。因此,如果我们“先计算i++
,然后进行赋值”,您是否会执行“获取i的值;增量i;将i设置为它的旧值”,并最终得到i==0
?“优先级”并不意味着“事情发生的顺序”。这可能是个不好的词,但我们一直在使用它(在正常的英语用法中,这个词来自“prefore”,它暗示了一段前后的关系,但在C语言中没有这样的含义)@coolguy你打错了!OP明显混淆了进位点和顺序点,dup确实涵盖了这一差异!未阅读DUP,请勿打开锤子!值得指出的是,两个副作用并不是唯一的问题。同一内存位置的副作用(“写入”)和求值(“读取”)之间没有序列点,这也是未定义的行为。@aschepper但在表达式i=i++
中“写入同一内存位置”之后“没有读取内存位置”。当计算i++
时,变量i
读取一次。然后是两个相互冲突的写入。没有其他的读操作。@ J6T是的,我不是在谈论给定的例子,只是关于序列点和一般未定义行为的一点。@ J6T考虑表达式<代码> I+I++< /Cord>。同样,未定义的行为,但这一次是读写竞相执行。Aschepler是完全正确的,这一点值得一提。@Aschepler:i++
(即i+=1
,即i=i+1
)由读和写组成。它们之间没有顺序点。这与你的说法相矛盾。类似的a=i=j
可能包括写入i
加上读取(i
和j
)或仅j
。
d = a>5 ? a : ++a;
il = ir++ // Note that suffix l and r are used for the sake of clarity.
// Both il and ir represents the same object.
temp = ir; // i = 0
ir = ir + 1; // i = 1 side effect by ++ before assignment
il = temp; // i = 0 result is 0
temp = ir; // i = 0
il = temp; // i = 0 side effect by assignment before ++
ir = ir + 1; // i = 1 result is 1