Home > Mobile >  why my program failed to be accepted just because I reverse the order of &&-conditinos of loop?
why my program failed to be accepted just because I reverse the order of &&-conditinos of loop?

Time:11-27

I want to find where the leading zero ends in a string? but a unexpected problems happened...

for(i=2980;(bin[i]==0)&&(i>=0);i--);//this failed to past 
for(i=2980;i>=0&&bin[i]==0;i--);//this is accepted by testing-web

but I think this two expressions have the same meaning..I can't find the reason ,please help me, thank you.

CodePudding user response:

I think this two expressions have the same meaning

They do not. They differ.

a && b is a "short-circuit" evaluation.
If a is false, b is not evaluated.
If a is true, then b is evaluated.

Consider what happens when i == -1:

// Only (-1 >= 0) evaluated
// Since it was false bin[-1]==0 was not attempted.
(i >= 0) && (bin[i]==0)

// Code first tries bin[-1], which is outside the array bin[]
// Result: undefined behavior (UB).
// In OP's case, program failed.
(bin[i]==0) && (i>=0)

CodePudding user response:

Let's look at how the for loop works...

Let's say i is 0:

for (i=2980; (bin[i]==0)&&(i>=0);i--)

Replacing i with 0 gives:

for (i=2980; (bin[0]==0)&&(0>=0);i--)

This is OK because 0 is a valid index. It then runs i-- and now i == -1 and it runs the for loop again:

for (i=2980; (bin[-1]==0)&&(-1>=0);i--)

So -1 is an invalid index. Swapping those two operations around "short circuits" the check and because (-1>=0) fails, it never runs bin[-1]==0.

  •  Tags:  
  • c
  • Related