为什么在语句“m = ++i ||”中“k”不递增++j && ++k”?
Why isn't “k” incremented in the statement “m = ++i || ++j && ++k”?
第一部分:
i=j=k=1;
m = ++i && ++j || ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
输出:2, 2, 1, 1
第一部分很容易理解,这里++i && ++j
先执行,这是真的(并且增加i和j的值)所以不需要检查下一部分的OR操作(不需要增加k的值) 。
第二部分:
i=j=k=1;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
输出:2、1、1、1
第二部分容易理解,这里++i || ++j
先执行,其中++i
为真(并且增加i
的值,因为OR运算所以不需要增加值j
)。接下来在这里执行AND操作应该是k=2
的增量值(但仍然是k print 1的值)。
亲爱的利他主义者,请解释一下第二部分发生了什么。
&&
在 C/C++ 中的优先级高于 ||
,将您的代码呈现为:
m = ++i || (++j && ++k);
由于++i
已经为真,所以不执行第二部分(short-circuit evaluation)。
运算符优先级参见 http://de.cppreference.com/w/cpp/language/operator_precedence。
我认为您对 i, j, k, and m
的使用可能会使您更难看到正在发生的事情。
int i, j, k;
i=j=1;
k = ++i && ++j;
printf("%d, %d, %d\n", i, j, k); // 2, 2, 1
i=j=1;
k = ++i || ++j;
printf("%d, %d, %d\n", i, j, k); // 2, 1, 1
如果您想了解有关运算符优先级的更多信息,请查看 https://en.wikipedia.org/wiki/Short-circuit_evaluation to learn more about the concept behind what you are seeing and http://en.cppreference.com/w/c/language/operator_precedence。
第一部分:
i=j=k=1;
m = ++i && ++j || ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
输出:2, 2, 1, 1
第一部分很容易理解,这里++i && ++j
先执行,这是真的(并且增加i和j的值)所以不需要检查下一部分的OR操作(不需要增加k的值) 。
第二部分:
i=j=k=1;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
输出:2、1、1、1
第二部分容易理解,这里++i || ++j
先执行,其中++i
为真(并且增加i
的值,因为OR运算所以不需要增加值j
)。接下来在这里执行AND操作应该是k=2
的增量值(但仍然是k print 1的值)。
亲爱的利他主义者,请解释一下第二部分发生了什么。
&&
在 C/C++ 中的优先级高于 ||
,将您的代码呈现为:
m = ++i || (++j && ++k);
由于++i
已经为真,所以不执行第二部分(short-circuit evaluation)。
运算符优先级参见 http://de.cppreference.com/w/cpp/language/operator_precedence。
我认为您对 i, j, k, and m
的使用可能会使您更难看到正在发生的事情。
int i, j, k;
i=j=1;
k = ++i && ++j;
printf("%d, %d, %d\n", i, j, k); // 2, 2, 1
i=j=1;
k = ++i || ++j;
printf("%d, %d, %d\n", i, j, k); // 2, 1, 1
如果您想了解有关运算符优先级的更多信息,请查看 https://en.wikipedia.org/wiki/Short-circuit_evaluation to learn more about the concept behind what you are seeing and http://en.cppreference.com/w/c/language/operator_precedence。