Я использую язык 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
.
&&
создает точку последовательности. Из Википедии гарантируется, что все побочные эффекты предыдущих оценок будут выполнены, и никаких побочных эффектов от последующих оценок еще не наблюдалось. Оценка идет слева направо. - person Weather Vane   schedule 18.12.2020num1++
была (как вы предполагали) вычислена первой, она бы оценивалась как0
, и правило короткого замыкания говорило бы об этом, потому что все выражение не может бытьtrue
, другая (первая) часть не оценивается, поэтомуnum1
не может быть2
, как вы предполагаете. - person Weather Vane   schedule 18.12.2020