如何编译if语句编译

-5 c c++ compiler-construction

main()    
{

   int k = 5;

    if(++k <5 && k++/5 || ++k<=8);  // how to compiler compile this statement 
  print f("%d",k);
}
Run Code Online (Sandbox Code Playgroud)

//这里的答案是7但是为什么?

Pau*_*l R 6

++k < 5求值为false(6 <5 = false),因此&&不评估运算符的RHS (因为已知结果为假).++k <= 8然后评估(7 <= 8 =真),因此完整表达式的结果为真,并且k已经递增两次,使其最终值为7.

注意,&&并且||路布尔运算符 - 如果表达式的结果可以由左手参数确定,则不评估右手参数.

另请注意,与大多数运算符不同,短路运算符定义表达式中的序列点,这使得在上面的示例k中在同一表达式中多次修改是合法的(通常,这不允许在没有插入序列点的情况下导致未定义行为).