You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Operator-Precedence-Problems.html 6.3KB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 1987-2020 Free Software Foundation, Inc.
  4. Permission is granted to copy, distribute and/or modify this document
  5. under the terms of the GNU Free Documentation License, Version 1.3 or
  6. any later version published by the Free Software Foundation. A copy of
  7. the license is included in the
  8. section entitled "GNU Free Documentation License".
  9. This manual contains no Invariant Sections. The Front-Cover Texts are
  10. (a) (see below), and the Back-Cover Texts are (b) (see below).
  11. (a) The FSF's Front-Cover Text is:
  12. A GNU Manual
  13. (b) The FSF's Back-Cover Text is:
  14. You have freedom to copy and modify this GNU Manual, like GNU
  15. software. Copies published by the Free Software Foundation raise
  16. funds for GNU development. -->
  17. <!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  20. <title>Operator Precedence Problems (The C Preprocessor)</title>
  21. <meta name="description" content="Operator Precedence Problems (The C Preprocessor)">
  22. <meta name="keywords" content="Operator Precedence Problems (The C Preprocessor)">
  23. <meta name="resource-type" content="document">
  24. <meta name="distribution" content="global">
  25. <meta name="Generator" content="makeinfo">
  26. <link href="index.html#Top" rel="start" title="Top">
  27. <link href="Index-of-Directives.html#Index-of-Directives" rel="index" title="Index of Directives">
  28. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  29. <link href="Macro-Pitfalls.html#Macro-Pitfalls" rel="up" title="Macro Pitfalls">
  30. <link href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon" rel="next" title="Swallowing the Semicolon">
  31. <link href="Misnesting.html#Misnesting" rel="prev" title="Misnesting">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.indentedblock {margin-right: 0em}
  36. blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
  37. blockquote.smallquotation {font-size: smaller}
  38. div.display {margin-left: 3.2em}
  39. div.example {margin-left: 3.2em}
  40. div.lisp {margin-left: 3.2em}
  41. div.smalldisplay {margin-left: 3.2em}
  42. div.smallexample {margin-left: 3.2em}
  43. div.smalllisp {margin-left: 3.2em}
  44. kbd {font-style: oblique}
  45. pre.display {font-family: inherit}
  46. pre.format {font-family: inherit}
  47. pre.menu-comment {font-family: serif}
  48. pre.menu-preformatted {font-family: serif}
  49. pre.smalldisplay {font-family: inherit; font-size: smaller}
  50. pre.smallexample {font-size: smaller}
  51. pre.smallformat {font-family: inherit; font-size: smaller}
  52. pre.smalllisp {font-size: smaller}
  53. span.nolinebreak {white-space: nowrap}
  54. span.roman {font-family: initial; font-weight: normal}
  55. span.sansserif {font-family: sans-serif; font-weight: normal}
  56. ul.no-bullet {list-style: none}
  57. -->
  58. </style>
  59. </head>
  60. <body lang="en">
  61. <a name="Operator-Precedence-Problems"></a>
  62. <div class="header">
  63. <p>
  64. Next: <a href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon" accesskey="n" rel="next">Swallowing the Semicolon</a>, Previous: <a href="Misnesting.html#Misnesting" accesskey="p" rel="prev">Misnesting</a>, Up: <a href="Macro-Pitfalls.html#Macro-Pitfalls" accesskey="u" rel="up">Macro Pitfalls</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Index-of-Directives.html#Index-of-Directives" title="Index" rel="index">Index</a>]</p>
  65. </div>
  66. <hr>
  67. <a name="Operator-Precedence-Problems-1"></a>
  68. <h4 class="subsection">3.10.2 Operator Precedence Problems</h4>
  69. <a name="index-parentheses-in-macro-bodies"></a>
  70. <p>You may have noticed that in most of the macro definition examples shown
  71. above, each occurrence of a macro argument name had parentheses around
  72. it. In addition, another pair of parentheses usually surround the
  73. entire macro definition. Here is why it is best to write macros that
  74. way.
  75. </p>
  76. <p>Suppose you define a macro as follows,
  77. </p>
  78. <div class="smallexample">
  79. <pre class="smallexample">#define ceil_div(x, y) (x + y - 1) / y
  80. </pre></div>
  81. <p>whose purpose is to divide, rounding up. (One use for this operation is
  82. to compute how many <code>int</code> objects are needed to hold a certain
  83. number of <code>char</code> objects.) Then suppose it is used as follows:
  84. </p>
  85. <div class="smallexample">
  86. <pre class="smallexample">a = ceil_div (b &amp; c, sizeof (int));
  87. &rarr; a = (b &amp; c + sizeof (int) - 1) / sizeof (int);
  88. </pre></div>
  89. <p>This does not do what is intended. The operator-precedence rules of
  90. C make it equivalent to this:
  91. </p>
  92. <div class="smallexample">
  93. <pre class="smallexample">a = (b &amp; (c + sizeof (int) - 1)) / sizeof (int);
  94. </pre></div>
  95. <p>What we want is this:
  96. </p>
  97. <div class="smallexample">
  98. <pre class="smallexample">a = ((b &amp; c) + sizeof (int) - 1)) / sizeof (int);
  99. </pre></div>
  100. <p>Defining the macro as
  101. </p>
  102. <div class="smallexample">
  103. <pre class="smallexample">#define ceil_div(x, y) ((x) + (y) - 1) / (y)
  104. </pre></div>
  105. <p>provides the desired result.
  106. </p>
  107. <p>Unintended grouping can result in another way. Consider <code>sizeof
  108. ceil_div(1, 2)</code>. That has the appearance of a C expression that would
  109. compute the size of the type of <code>ceil_div (1, 2)</code>, but in fact it
  110. means something very different. Here is what it expands to:
  111. </p>
  112. <div class="smallexample">
  113. <pre class="smallexample">sizeof ((1) + (2) - 1) / (2)
  114. </pre></div>
  115. <p>This would take the size of an integer and divide it by two. The
  116. precedence rules have put the division outside the <code>sizeof</code> when it
  117. was intended to be inside.
  118. </p>
  119. <p>Parentheses around the entire macro definition prevent such problems.
  120. Here, then, is the recommended way to define <code>ceil_div</code>:
  121. </p>
  122. <div class="smallexample">
  123. <pre class="smallexample">#define ceil_div(x, y) (((x) + (y) - 1) / (y))
  124. </pre></div>
  125. <hr>
  126. <div class="header">
  127. <p>
  128. Next: <a href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon" accesskey="n" rel="next">Swallowing the Semicolon</a>, Previous: <a href="Misnesting.html#Misnesting" accesskey="p" rel="prev">Misnesting</a>, Up: <a href="Macro-Pitfalls.html#Macro-Pitfalls" accesskey="u" rel="up">Macro Pitfalls</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Index-of-Directives.html#Index-of-Directives" title="Index" rel="index">Index</a>]</p>
  129. </div>
  130. </body>
  131. </html>