我知道执行后的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");
}
答案 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()
不会返回true
或false
。
它返回写入的字符总数 - 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)
逻辑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
,优先级表示乘法运算符应用于2
和3
。 +
适用于1
和乘法结果。因此,编译器将上述语句解析为
1 +(2 * 3)
对上述表达式的评估顺序的约束是,如果没有乘法的结果,则不能完成加法。因此,在这种情况下,在加法(较低优先级)之前评估乘法(较高优先级)
在if()
语句中,优先级告诉编译器解析语句,使其具有包含第2和第3 printf()
的隐式paranthesis。这并不意味着必须首先对这些进行评估,如前所述。
所以,我们看到了两个案例。在一个方面,优先权不控制/影响评估顺序,而其他优先权则具有间接影响。
__
“虽然优先权可能影响评估顺序,但
答案 5 :(得分:0)
OR运算符是左关联的,即左边的整个表达式被视为其左操作数。在你的情况下,AND运算符属于OR运算符的右操作数。当你不确定一个关联的时候运算符,使用括号。