-3

我知道 printf 执行后返回一些非零值 {EDIT:returns no. of 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");
 }
4

6 回答 6

5

成功printf()时返回写入的字符总数。因此printf("hie")返回 3,这对于逻辑“或”条件的惰性求值已经足够了。

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

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

于 2013-10-19T07:42:11.063 回答
3

printf("hie")返回 3 并且在 C 中任何非零值都表示true. 休息应该简单易懂。

请注意,在这种情况下:

Condition1 || Condition2 || Condition3  || Condition4

当 Condition2 为 false 且 Condition1 也为 false 时,才会评估 Condition3 。否则,如果 Condition1 为假,则仅检查 Condition2,如果 Condition2 为假,则检查 Condition3,依此类推。

后面的条件(在 Condition1 之后)将不会被评估,因为如果 Condition1 已经为真,那么尝试评估 Condition2、Condition3 和 Condition4 是没有意义的。由于控件无论如何都会进入if块,无论其他条件如何评估。

对于以下情况:

Condition1 && Condition2 && Condition3 && Condition4

当任何条件评估为错误时,不会对其他条件进行进一步评估(实际上不需要)。

单个条件可以是更复杂的条件,例如 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中-您混淆了运算符优先级和评估顺序。

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

于 2013-10-19T07:43:33.940 回答
2

printf()不返回truefalse

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

于 2013-10-19T07:42:18.917 回答
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");

于 2013-10-19T08:13:50.027 回答
2

为什么这里的输出只有“hie”和“hola”?

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

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首先打印并返回 a non-zero-value,满足||条件,然后是if条件返回true


有关优先顺序和评估顺序的更多信息:

答案之一指出

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

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

考虑,

1 + 2 * 3

很明显, 的优先级*高于+。当两个运算符共享一个操作数时,优先级会深入到图片中,并且操作数与具有最高优先级的运算符分组。在上面的语句*+共享相同的操作数2,优先级告诉乘法运算符适用于23+应用于1乘法的结果。因此,编译器将上述语句解析为,

1 + (2 *3)

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


在您的if()语句中,优先级告诉编译器以这样一种方式解析语句,即它有一个包含 2nd 和 3rd 的隐式括号printf()。这并不意味着必须先评估这些,如前所述。

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

__

简而言之

“虽然优先级可能会影响评估的顺序,但它并不能决定评估的顺序”

于 2013-10-19T08:34:54.313 回答
0

OR 运算符是左关联的,即其左侧的整个表达式被视为其左操作数。在您的情况下,AND 运算符属于 OR 运算符的右操作数。当您不确定运算符的关联性时,请使用插入语。

于 2013-10-19T07:53:47.773 回答