提前感谢您阅读和回答我的问题。 代码在这里:
1 #include <stdio.h>
2
3 int main(void)
4 {
5 int i = 1;
6 int j = 2;
7 int k = 3;
8
9 printf("%d\n", i < j || k);
10
11 return 0;
12 }
输出:1
我相信: 我&lt; j = 1 并且k = 3这是非零值,输出为1
我是否正在处理this?
我的信念是仅执行此二进制语句的第一部分(不评估|| k)。我是对的吗?
C99规范:
||运营商保证从左到右的评估;有一个 评估第一个操作数后的序列点。如果是第一个 操作数比较不等于0,不计算第二个操作数。
非常感谢任何解释此行为的其他信息。 我不经常问社区,但是在这种情况下我感到有些困惑,并会欣赏一些C-ninjas的一些信息。再次感谢。
答案 0 :(得分:1)
在表达式i < j || k
中,由于i
小于j
,
第一个子句为真,k
未被评估。
但是,即使k
进行了评估,输出仍然是1。
例如,
int i = 2;
int j = 1;
int k = 3;
printf("%d\n", i < j || k);
由于i
不小于j
,因此第一个子句为false,第二个子句为
必须评估条款。由于k
不为零,第二个条款为真,
并且整个表达式是&#34; true&#34;。分配给a的数值
&#34;真&#34;布尔表达式为1,因此输出为1.
答案 1 :(得分:0)
你得到的是逻辑测试的输出。逻辑测试可以是TRUE
或FALSE
(1或0)。
当你这样做时
50 || 1
逻辑测试结果是TRUE
(我假设您知道真值表)。
所以你的输出是1
。
然而,当你这样做时
50 | 1
结果为51
。
这个稍微修改过的程序版本证明了:
#include <stdio.h>
int main(void)
{
int i = 1;
int j = 2;
int k = 3;
printf ("%d\n", i < j || k);
printf ("%d\n", i < j | k);
return 0;
}
&&
和||
是逻辑运算符,将返回逻辑值(TRUE
或FALSE
)。