Hay que tener en cuenta 3 reglas:
1)Por defecto, el parser analiza de izquierda a derecha, y de arriba hacia abajo. 2)Si una sentencia involucra varios operadores, se ejecutan según una prioridad pre-establecida en el parser, de mayor a menor prioridad. 3)Los paréntesis permiten explicitar y/o modificar el orden de ejecución. Por lo general, la mayoría de los parseadores evalúan toda la expresión, aún cuando no hace necesariamente falta, debido a que el resultado es inminente.
Ojo que en este caso:
void main()
{
int a,b,c;
a=1;
b=0;
c=0;
if (a&&b||(++c==a))
{
printf("entro %d\n", c);
}
}
& es distinto de &&. & es AND aritmético y && es AND lógico.
Por ejemplo, no es lo mísmo:
1 & 2 = 0
que
1 && 2 = 1
Por otro lado, tu conclusión es correcta(&& efectivamente tiene asignada mayor prioridad que ||) pero el ejemplo no es prueba suficiente de ello.
Para poder comprobar que efectivamente un operador tiene mayor prioridad sobre otro(si no logramos encontrar la tabla de prioridades del lenguaje, que sería más sencillo) debemos colocar el operador que creemos que tiene mayor prioridad que el otro en un ejemplo más, pero a la DERECHA, para darle la posibilidad al supuesto de menor prioridad a poder nuevamente ser pospuesto en su ejecución aún teniendo la ventaja por defecto de encontrarse a la IZQUIERDA del otro.
por ende , haciendo además del ejemplo anterior:
if ((++c == a) || a && b)
{
printf("entro %d\n", c);
}
nuevamente logra ingresar demostrando, entonces sí, que indudablemente el operador && tiene mayor prioridad que el ||.
Los () son los que mayor prioridad poseen, por lo que el orden puede adulterarse explícitamente:
if (((++c == a) || a) && b)
{
printf("entro %d\n", c);
}
Logrando que no se logre satisfacer la condición y por lo tanto que no se imprima nada.