Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ de>c将绑定到*,表达式将被解析为a+(b*c)_C++_C_Language Lawyer - Fatal编程技术网

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