如果声明无法理解

时间:2016-05-03 14:18:10

标签: c if-statement

下周我将参加一个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)

我不知道这是在寻找我唯一的假设是它将永远是真的。我是对的还是还有更多呢?

7 个答案:

答案 0 :(得分:12)

这项任务有两个目标:

  • 显示C中的布尔值:基本上它们评估为使用false映射为0并且true映射到1的整数。反过来,任何数字或指针值都可以在整数上下文中使用,具有相应的零值(0 ,0.0,NULL(指针),0.0f,0L等)评估为假,其他所有为真。
  • 显示运营商的优先级

&&的优先级高于||,因此此声明等同于

a-2 || (b&&c) || a

如果任何值为真,将评估为true

作为a==2a-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。