main()
{
int i=-3, j=2;
int m = ++i || ++j;
printf("%d %d",i,j);
}
如果前缀增量运算符具有从右到左的关联性,则应首先执行++ j。但这里只有++我执行而++ j没有。为什么呢?
答案 0 :(得分:5)
您的观察与运算符关联性无关,而与二进制逻辑运算符的执行顺序的定义无关。
您正在使用++ j作为逻辑操作的第二个运算符。在C中,二进制逻辑运算符具有"提前退出",也就是说,只要进一步执行不再改变结果,执行就会停止。当||的左操作数时就是这种情况评估为TRUE,或左右操作数&&评估为FALSE。在前一种情况下,无论其他操作数产生什么,结果都为TRUE。在后一种情况下,它是错误的,进一步的评估不会改变它。
如果您将函数用作逻辑运算符的操作数,则此语言功能非常重要。它保证以指定的顺序调用函数,并且只评估那些对结果有贡献的函数。
在您的示例中,您评估:
int m = ++i || ++j;
由于i == -3,++ i得到-2,它不是0,因此被解释为TRUE。所以评价||停在这里,j没有碰到。
答案 1 :(得分:2)
你错了后缀增量运算符从左到右的关联性。
如果您仍有疑问,请查看以下链接:http://en.cppreference.com/w/cpp/language/operator_precedence
编辑:
前缀运算符具有从右到左的关联性,但优先级和关联性不会告诉您评估的顺序。他们只告诉你有关分组的信息。例如,优先级是指使用 b + c被分组为(a b)+ c而不是*(b + c)。编译器可以按照它认为适合的任何顺序自由地评估a,b和c。当您拥有相同优先级的运算符(通常是相同的运算符)时,关联性会告诉您有关分组的信息。例如,它告诉你a-b-c等价于(a-b)-c,而不是a-(b-c)(另有说明,减法是左关联的)。
评估顺序由序列点定义。在完整表达式的末尾有一个序列点(除其他外)。在序列点,必须进行所有先前的评估,并且尚未进行任何后续评估。