home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / lang / c / 12979 < prev    next >
Encoding:
Text File  |  1992-08-30  |  2.8 KB  |  66 lines

  1. Newsgroups: comp.lang.c
  2. Path: sparky!uunet!charon.amdahl.com!pacbell.com!att!linac!pacific.mps.ohio-state.edu!zaphod.mps.ohio-state.edu!uunet.ca!wildcan!sq!msb
  3. From: msb@sq.sq.com (Mark Brader)
  4. Subject: Re: Order of execution...
  5. Message-ID: <1992Aug30.204056.27873@sq.sq.com>
  6. Organization: SoftQuad Inc., Toronto, Canada
  7. References: <7942@lee.SEAS.UCLA.EDU>
  8. Distribution: usa
  9. Date: Sun, 30 Aug 92 20:40:56 GMT
  10. Lines: 54
  11.  
  12. >   while ((textline[index++] = tolower(textLine[index])) != '\0');
  13. > The question is will it always work? Or will sometimes work depending
  14. > on which side of the assignment gets evaluated first...?
  15.  
  16. It will never work until you spell your variables consistently, or use
  17. a macro to alias the two spellings!
  18.  
  19. Ignoring that... the code will indeed only "sometimes work", but not
  20. because the compiler may evaluate one or the other side of the assignment
  21. first.  It can actually interlace the evaluation of the two parts!
  22. Thus it can choose to begin by evaluating the index++ on the left and
  23. by storing the incremented result in the variable, and then continue
  24. by evaluating the right side, and then finish off the left side.
  25.  
  26. > Is there a better way to do this (and still keep it a one liner).
  27.  
  28. Actually, most people feel that writing it on one line as it is is a
  29. bad idea; the single semicolon that is the loop body is hard to see.
  30. There are various other styles; I like the next tersest, which is to put
  31. the semicolon alone on the next line.
  32.  
  33. You want to get the increment out of the assignment, and the neatest
  34. way to do this is to use a for loop.  I have also separated the test
  35. from the assignment, which in this case seems clearer to me and also
  36. avoids calling tolower() on the final null.
  37.  
  38.     for ( ; textLine[index] != '\0'; ++index)
  39.         textLine[index] = tolower (textLine[index]);
  40.  
  41. You may of course write this on one line if you wish.  I'd probably
  42. eliminate the needless variable "index" and write it like this:
  43.  
  44.     for ( ; *s; ++s) *s = tolower (*s);
  45.  
  46. or, some days, slightly more verbosely:
  47.  
  48.     for ( ; *s != '\0'; ++s)
  49.         *s = tolower (*s);
  50.  
  51. where "char *s;" replaces your "char textLine[];", on the grounds that
  52. (opinions follow) stereotypical uses of variables do not need long names,
  53. and that formal parameters should be declared with their true types.
  54.  
  55. Incidentally, note that applying tolower() to characters which may not
  56. be upper case letters is NOT portable to pre-ANSI C implementations.
  57. For this article I am assuming that either the implementation is ANSI C
  58. or that the string has been verified to contain only upper case letters.
  59. -- 
  60. Mark Brader            At any rate, C++ != C.  Actually, the value of the
  61. SoftQuad Inc., Toronto        expression "C++ != C" is implementation-defined.
  62. utzoo!sq!msb, msb@sq.com                -- Peter da Silva
  63.  
  64. Actually that value is undefined.  This article is in the public domain.
  65.