c中具有“后缀减量”和“逻辑与”运算符的运算符关联

RapidDev

免责声明:我不是这样的代码,我只是想了解c语言的工作原理!!!

输出为12。

该表达式(a-- == 10 && a-- == 9)从左到右求值,并且在时a仍为10,a-- == 10但对于而言a为9 a-- == 9

1)关于增加后评估的时间有明确的规定吗?从这个例子看来,它在&&之前但在==之后求值。那是因为&&逻辑运算符产生a-- == 10一个完整的表达式,所以a执行后会被更新吗?

2)同样对于c / c ++,某些运算符(如前缀递减)从右到左出现,因此a == --a先将a递减至9,然后将9 == 9进行比较。是否有这样的理由设计c / c ++?我知道对于Java,情况恰恰相反(它从左到右求值)。

#include <stdio.h>

int main() {
    int a = 10;
    if (a-- == 10 && a-- == 9)
        printf("1");
    a = 10;
    if (a == --a)
        printf("2");
    return 0;
}
dbush

逻辑&&运算符包含在第一和第二操作数的求之间的序列点部分原因是,--在评估右侧之前,作为左侧一部分的任何副作用(例如操作员执行的副作用)都是完整的。

C标准的6.5.13p4节中关于逻辑AND运算符对此进行了详细说明

与按位二进制&运算符不同,&&运算符保证从左到右的求值;如果对第二个操作数求值,则在第一个和第二个操作数的求值之间有一个序列点。如果第一个操作数比较等于0,则不评估第二个操作数。

对于此表达式:

(a-- == 10 && a-- == 9)

首先将a(10)的当前值与10进行相等性比较。这是正确的,因此将评估右侧,但不会在左侧进行减量运算之前进行评估a然后,a比较(现在为9)的当前值与9的相等性。这也是正确的,因此整个表达式的计算结果为true。在执行下一条语句之前a,已完成了在右侧执行的递减副作用。

但是此表达式:

if (a == --a)

涉及a在没有序列点的情况下以相同的表达式进行读写这会调用未定义的行为

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++中的减量运算符

来自分类Dev

前缀和后缀运算符C ++

来自分类Dev

C运算符的优势:增量运算符和逻辑运算符

来自分类Dev

C#中的前缀和后缀运算符重载

来自分类Dev

逻辑AND(&&)和OR(||)运算符

来自分类Dev

带有增量和减量运算符的指针

来自分类Dev

C ++中的逻辑XOR运算符?

来自分类Dev

逻辑运算符和增量运算符

来自分类Dev

逻辑&&运算符

来自分类Java

前缀和后缀运算符Java

来自分类Dev

C++ 重载后缀运算符

来自分类Dev

C ++如何重载后缀运算符?

来自分类Dev

Java中前缀和后缀++运算符之间的区别

来自分类Dev

C ++中具有self的复合赋值运算符

来自分类Dev

具有按位运算符的C ++中的算法

来自分类Dev

C ++中重载的==和!=运算符

来自分类Dev

具有多个逻辑运算符(AND,OR)的嵌套IF条件

来自分类Dev

C ++运算符“ <”和“>”

来自分类Dev

C:运算符->和*

来自分类Dev

空合并运算符(??)与ECMAScript中的逻辑OR运算符(||)有何不同?

来自分类Dev

C ++ 14中std :: string的运算符后缀

来自分类Dev

后缀!C#中的(感叹号)运算符

来自分类Dev

Perl逻辑和运算符

来自分类Dev

条件和逻辑运算符

来自分类Dev

右移和赋值运算符逻辑?

来自分类Dev

使 ++o++ 抱怨具有用户定义的前缀和后缀增量运算符的类型

来自分类Dev

方案编程语言中的增量和减量运算符

来自分类Dev

+ =运算符和新的运算符c#

来自分类Dev

+ = C ++中的运算符