首页 > 解决方案 > C 运算符和优先级

问题描述

我使用 C 语言,代码如下:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int num1=0;

    int res = ++num1 && num1++;

    printf("%d\t%d\n",num1,res);    
}

在上面的代码中,我得到的输出为2 1. 我认为输出应该是2 0.

如有错误请指正,为解决此语句,由于优先级最高,首先执行 num1++(0),然后执行 ++num1(2),最后执行 &&,因为它具有最低优先级。

请评论此语句是如何执行的。

在一些教程中,我发现后缀 ++ 和前缀 ++ 具有相同的优先级,但如果这是真的,那么根据关联规则再次 num1++ 应该首先执行(从右到左),这应该再次导致答案为2 0.

标签: coperatorsoperator-precedencesequence-pointslogical-and

解决方案


在用作初始化器的表达式中

 int res = ++num1 && num1++;

运算符有一个序列点&&

来自 C 标准(6.5.13 逻辑与运算符)

3 如果 && 运算符的两个操作数比较不等于 0,则 && 运算符将产生 1;否则,它产生 0。结果具有 int 类型。

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

首先计算运算符的左操作数,结果num1将等于 1,因为一元(前缀)增量运算符。由于子表达式不等于 0,则计算第二个操作数。它的值是递增之前的值,即 1。由于第二个操作数也不等于 0,因此整个表达式被评估为逻辑真,其值为 1(参见 C 标准的第一个引号)。

该值 1 分配给变量res,而num1后缀增量后的变量将等于 2。

因此,在此声明之后,您将拥有res等于1num1等于2


推荐阅读