为什么printf不在这里打印?

时间:2013-10-19 07:39:09

标签: c++ c printf

我知道执行后的printf返回一些非零值{编辑:返回否。 charecters}现在在这个例子中我使用了多个printf和现在。,

 /* As far as i was cocerned Precedence of && is more than ||,
  *and these logical operators check from left to right  
  *So compiler should come to hello and print "hello" then "nice to see you" then "hie" 
  *as all are true it should print "hola" 
  *but i wonder, why here the output is only "hie" and "hola"?
  */  

 #include<stdio.h>
 main()
 {
    if(printf("hie")|| printf("hello")&& printf("nice to see you"))
    printf("\thola\n");
 }

6 个答案:

答案 0 :(得分:5)

成功printf()返回写入的字符总数。 因此printf("hie")返回3,这足以对逻辑“或”条件进行惰性评估。

printf("hie")|| printf("hello") 
// --> 3 || whatever --> 
// true || whatever --> 
// true

因此,根本不需要评估printf("hello")

答案 1 :(得分:3)

printf("hie")返回3,而在C中,任何非零值都表示true。休息应该很容易理解。

请注意以下情况:

Condition1 || Condition2 || Condition3  || Condition4

如果Condition2为false且Condition1也为false,则Condition3将进行评估。另外,如果Condition1为假,则仅检查Condition2,如果Condition2为false,则检查Condition3,依此类推。

后一个条件(在条件1之后)将不会被评估,因为如果条件1已经为真,则没有必要尝试评估条件2,条件3和条件4。由于控件无论如何都会进入if块,无论其他条件如何评估。

对于以下情况:

Condition1 && Condition2 && Condition3 && Condition4

当任何条件评估为false时,不会进一步评估其他条件(事实上不需要)。

个别条件可以是更复杂的条件,如Condition2也可以是形式的表达式 -

Condition2 -->   ( SubCondition1 || SubCondition2 )

理解这种情况的一个很好的例子是假设您为NULL测试一个对象,然后才想测试其他条件:

int *p =NULL;
if( p != NULL && *p < 100)  // -->  *p < 100 Should only checked if p is NOT NULL else Undefined Behavior

^现在假设如果允许这样做,那么我们将取消引用指向NULL的指针。这是此类评估的最佳示例/用途之一。

您在其中一条评论中说过&& has more precidence - 您的操作员优先顺序和评估顺序令人困惑。

  

评估顺序不依赖于优先级,关联性或(必然)依赖于明显的依赖性。

答案 2 :(得分:2)

printf()不会返回truefalse

它返回写入的字符总数 - if语句没有按照您的想法执行。

答案 3 :(得分:2)

首先Printf()返回打印的字符数,如果发生错误则返回负值。

 Secondly,  boolean works as follows
 TRUE || x ==TRUE here compiler wont check x. 
 FALSE && x==FALSE here compiler wont check x.

在剩余的情况下,编译器将检查x,即将处理x。

 In your case 
          printf("hie") gives TRUE hence TRUE ||x ==TRUE case
          i.e. x=printf("hello")&& printf("nice to see you") will not process.

现在为TRUE || x == TRUE 将结束printf(“\ thola \ n”);

答案 4 :(得分:2)

为什么输出只是“hie”和“hola”?

逻辑AND(&&)的优先顺序大于逻辑OR(||)。同意。但是,这并不意味着程序必须按该顺序进行评估。它只是说将表达式组合在一起。因此,

if(printf("hie")|| printf("hello")&& printf("nice to see you"))

相当于,

 if(printf("hie")  ||  (printf("hello")&& printf("nice to see you")) )

||”运算符的短路评估发生:

  

[C11:§6.5.14/ 4]与按位|不同运算符,||运营商保证从左到右的评估;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。 如果第一个操作数与0不等,则不评估第二个操作数。

因此,hie首先打印并返回non-zero-value,满足||条件,然后if条件返回true


更多关于优先顺序和评估顺序:

其中一个答案,说明

  

评估顺序不依赖于优先级,关联性或(必然)依赖于明显的依赖性。

尽管距离更近但这并非完全正确。虽然优先级与评估顺序不同。在某些情况下,优先级间接会影响评估顺序。

考虑一下,

  

1 + 2 * 3

很明显,*的优先顺序高于+。当两个运算符共享一个操作数时,优先级进入图像,操作数与具有最高优先级的运算符组合在一起。在上面的语句中,*+共享相同的操作数2,优先级表示乘法运算符应用于23+适用于1和乘法结果。因此,编译器将上述语句解析为

  

1 +(2 * 3)

对上述表达式的评估顺序的约束是,如果没有乘法的结果,则不能完成加法。因此,在这种情况下,在加法(较低优先级)之前评估乘法(较高优先级)


if()语句中,优先级告诉编译器解析语句,使其具有包含第2和第3 printf()的隐式paranthesis。这并不意味着必须首先对这些进行评估,如前所述。

所以,我们看到了两个案例。在一个方面,优先权不控制/影响评估顺序,而其他优先权则具有间接影响。

__

简而言之

“虽然优先权可能影响评估顺序,但

答案 5 :(得分:0)

OR运算符是左关联的,即左边的整个表达式被视为其左操作数。在你的情况下,AND运算符属于OR运算符的右操作数。当你不确定一个关联的时候运算符,使用括号。