下周我将参加一个C大学考试,我正在查看旧的考试试卷,其中一个问题给出了这个零碎的代码。
int a=2, b=-1, c=0;
if (a-2||b&&c||a){
printf("True\n");
} else {
printf("False\n");
}
我们必须确定这段代码的输出是什么,但if语句对我来说没有任何意义,如果我遇到的语句非常具体,比如说
if( x == 0)
我不知道这是在寻找我唯一的假设是它将永远是真的。我是对的还是还有更多呢?
答案 0 :(得分:12)
这项任务有两个目标:
&&
的优先级高于||
,因此此声明等同于
a-2 || (b&&c) || a
如果任何值为真,将评估为true
。
作为a==2
,a-2
为0. c
为0,因此b && c
也为0.
所以我们有0 || 0 || a
,这是真的,因为a
是2。
答案 1 :(得分:2)
大多数语言将非零整数解释为 true ,将零解释为 false ,因此您必须计算每个条款。没有任何括号,我建议the && statement is taken in account first。所以我们有:
if (2-2 // gives zero
|| // OR
-1 && 0 // -1 AND 0 gives false
|| // OR
a) // Which is 2, which is true
所以你说得对,这句话总是 true 。这个练习是关于显示先前的命令,以及一切都是数字的事实,即使在布尔逻辑中也是如此。 这对你来说非常重要。
如果前一个是相反的(||>&&),你必须明白它本来是 false 。我认为这个例子的重点在这里。
(a-2 || b) && (c || a)
false && true
--> false
答案 2 :(得分:1)
你需要明白C中的真实和虚假总是数字。
https://www.le.ac.uk/users/rjm1/cotter/page_37.htm
即,评估为数字零的任何内容都是false,而评估为非零数字的任何内容都为true。
答案 3 :(得分:1)
在 c 语言中,整数0被视为 false ,任何非零整数值都是 true ,但应注意它是语言特定和sme语句将显示java中的编译错误,因为java更严格,整数不会转换为布尔值。
谈到上面的赋值问题,if语句中的表达式将计算为true
(a-2||b&&c||a)
与...相同
(2-2||-1&&0||2)
与...相同
(0||0||2)
被评估为
(false||false||true)
因此整个表达式的计算结果为
true
。
希望它有所帮助。
答案 4 :(得分:0)
int a=2, b=-1, c=0;
int first=a-2; //0 -> false
bool second= b&& c; // nonZero&&zero -> true&&false -> false
int third = 2; // nonZero -> true
// false|| false|| true -> true
if (first || second || third ){
printf("True\n");
} else {
printf("False\n");
}
答案 5 :(得分:0)
在解决这个问题之前,你需要先了解两件事 运算符优先级和 运营商的相关性
运算符优先级告诉c编译器首先执行哪个操作。 如果两个运算符具有相同的优先级,则关联性告诉您在表达式中从左到右或从右到左进行求值
int a=2, b=-1, c=0;
if (a-2||b&&c||a){
你可以认为它是
if((a-2)||(b&&c)||a){}
means - has top precedence so it will solved first
reduced to if(0||(b&&c)||a){}
then && has higher precedence so
reduced to if(0||false||a)
then the associativity is left to right so
reduced to if(false||a)
that is(false||2)
return true
答案 6 :(得分:-1)
在我所知的几乎所有编程语言中,0表示错误,1表示正确。
所以提出您的问题:您使用过&&
和||
运算符。这两个都称为逻辑运算符。
现在,您的第一个阻止是a-2||b :-
2-2||-1
0||-1
。现在,由于||
的正确表达式为-1
,因此运算符将返回1,即为True,因为0和-1之一的值为非零0即-1。
因此表达式解析为1&&c||a
: -
现在c=0
,因此1&&0
返回0,因为&&
只有在其左右两个表达式都不为零时才会返回1。
表达式变为0||2
: -
现在,因为||
(或运算符)只需要在右侧或左侧的一个操作数非零,因此0 || 2返回1.
现在您的if (a-2||b&&c||a)
语句已解析为
if (1)
{
printf("True\n"); }
else......
因此,1表示TRUE,if语句将执行,输出为True。