c - Clarification in Section 5.10 of K&R 2 -


a pattern recognition program must print lines containing patter if input find pattern. if input find -x pattern, program must print lines except lines containing pattern.

// ..... switch(c) { case 'x':     except=1;     break; // ...... }  // ...... while(getline(line,maxline)>0)     {     line_num++;     if( (strstr(line,*argv)!=null) != except)         {         if(number)             printf("%ld:",linenum);         printf("%s",line);         found++;         }     } // ...... 

in above code k&r except can either 1 or 0. how if(strstr...) block functions handle -x ?

the logic simple. if pattern "-x" should print lines not contain pattern.

for pattern except equal 1.

so lines contain pattern satisfy condition

strstr(line,*argv)!=null 

that condition equal 1 if line contains pattern.

thus if except equal 1 , condition strstr(line,*argv)!=null equal 1 should skip pattern.

otherwise if condition strstr(line,*argv)!=null not equal 1 if pattern not found if statement

if( (strstr(line,*argv)!=null) != except) 

yields true , compound statement executed.

on other hand if except equal 0 achieve condition in if statement evaluate true need condition strstr(line,*argv)!=null equal 1.

in fact can rewrite if statement

if( (strstr(line,*argv)!=null) != except) 

the following way

if( ( ( strstr(line,*argv) != null ) == 1 && except == 0 ) ||     ( ( strstr(line,*argv) != null ) == 0 && except == 1 ) ) 

shortly speaking if statement work if either

1 , 0 

or

0 , 1 

if either

1 , 1 

or

0 , 0 

then if statement not executed.

here 1 , 0 results of evaluating of 2 sub expressions in if statement.


Comments