hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2021 Free Software Foundation, Inc.
 
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Free Software" and "Free Software Needs
Free Documentation", with the Front-Cover Texts being "A GNU Manual,"
and with the Back-Cover Texts as in (a) below.
 
(a) The FSF's Back-Cover Text is: "You are free to copy and modify
this GNU Manual.  Buying copies from GNU Press supports the FSF in
developing GNU and promoting software freedom." -->
<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Debugging with GDB: C Operators</title>
 
<meta name="description" content="Debugging with GDB: C Operators">
<meta name="keywords" content="Debugging with GDB: C Operators">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="C.html#C" rel="up" title="C">
<link href="C-Constants.html#C-Constants" rel="next" title="C Constants">
<link href="C.html#C" rel="previous" title="C">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="C-Operators"></a>
<div class="header">
<p>
Next: <a href="C-Constants.html#C-Constants" accesskey="n" rel="next">C Constants</a>, Up: <a href="C.html#C" accesskey="u" rel="up">C</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="C-and-C_002b_002b-Operators"></a>
<h4 class="subsubsection">15.4.1.1 C and C<tt>++</tt> Operators</h4>
 
<a name="index-C-and-C_002b_002b-operators"></a>
 
<p>Operators must be defined on values of specific types.  For instance,
<code>+</code> is defined on numbers, but not on structures.  Operators are
often defined on groups of types.
</p>
<p>For the purposes of C and C<tt>++</tt>, the following definitions hold:
</p>
<ul>
<li> <em>Integral types</em> include <code>int</code> with any of its storage-class
specifiers; <code>char</code>; <code>enum</code>; and, for C<tt>++</tt>, <code>bool</code>.
 
</li><li> <em>Floating-point types</em> include <code>float</code>, <code>double</code>, and
<code>long double</code> (if supported by the target platform).
 
</li><li> <em>Pointer types</em> include all types defined as <code>(<var>type</var> *)</code>.
 
</li><li> <em>Scalar types</em> include all of the above.
 
</li></ul>
 
<p>The following operators are supported.  They are listed here
in order of increasing precedence:
</p>
<dl compact="compact">
<dt><code>,</code></dt>
<dd><p>The comma or sequencing operator.  Expressions in a comma-separated list
are evaluated from left to right, with the result of the entire
expression being the last expression evaluated.
</p>
</dd>
<dt><code>=</code></dt>
<dd><p>Assignment.  The value of an assignment expression is the value
assigned.  Defined on scalar types.
</p>
</dd>
<dt><code><var>op</var>=</code></dt>
<dd><p>Used in an expression of the form <code><var>a</var>&nbsp;<var>op</var>=&nbsp;<var>b</var></code><!-- /@w -->,
and translated to <code><var>a</var>&nbsp;=&nbsp;<var>a&nbsp;op&nbsp;b</var></code><!-- /@w -->.
<code><var>op</var>=</code><!-- /@w --> and <code>=</code> have the same precedence.  The operator
<var>op</var> is any one of the operators <code>|</code>, <code>^</code>, <code>&amp;</code>,
<code>&lt;&lt;</code>, <code>&gt;&gt;</code>, <code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>, <code>%</code>.
</p>
</dd>
<dt><code>?:</code></dt>
<dd><p>The ternary operator.  <code><var>a</var> ? <var>b</var> : <var>c</var></code> can be thought
of as:  if <var>a</var> then <var>b</var> else <var>c</var>.  The argument <var>a</var>
should be of an integral type.
</p>
</dd>
<dt><code>||</code></dt>
<dd><p>Logical <small>OR</small>.  Defined on integral types.
</p>
</dd>
<dt><code>&amp;&amp;</code></dt>
<dd><p>Logical <small>AND</small>.  Defined on integral types.
</p>
</dd>
<dt><code>|</code></dt>
<dd><p>Bitwise <small>OR</small>.  Defined on integral types.
</p>
</dd>
<dt><code>^</code></dt>
<dd><p>Bitwise exclusive-<small>OR</small>.  Defined on integral types.
</p>
</dd>
<dt><code>&amp;</code></dt>
<dd><p>Bitwise <small>AND</small>.  Defined on integral types.
</p>
</dd>
<dt><code>==<span class="roman">, </span>!=</code></dt>
<dd><p>Equality and inequality.  Defined on scalar types.  The value of these
expressions is 0 for false and non-zero for true.
</p>
</dd>
<dt><code>&lt;<span class="roman">, </span>&gt;<span class="roman">, </span>&lt;=<span class="roman">, </span>&gt;=</code></dt>
<dd><p>Less than, greater than, less than or equal, greater than or equal.
Defined on scalar types.  The value of these expressions is 0 for false
and non-zero for true.
</p>
</dd>
<dt><code>&lt;&lt;<span class="roman">, </span>&gt;&gt;</code></dt>
<dd><p>left shift, and right shift.  Defined on integral types.
</p>
</dd>
<dt><code>@</code></dt>
<dd><p>The <small>GDB</small> &ldquo;artificial array&rdquo; operator (see <a href="Expressions.html#Expressions">Expressions</a>).
</p>
</dd>
<dt><code>+<span class="roman">, </span>-</code></dt>
<dd><p>Addition and subtraction.  Defined on integral types, floating-point types and
pointer types.
</p>
</dd>
<dt><code>*<span class="roman">, </span>/<span class="roman">, </span>%</code></dt>
<dd><p>Multiplication, division, and modulus.  Multiplication and division are
defined on integral and floating-point types.  Modulus is defined on
integral types.
</p>
</dd>
<dt><code>++<span class="roman">, </span>--</code></dt>
<dd><p>Increment and decrement.  When appearing before a variable, the
operation is performed before the variable is used in an expression;
when appearing after it, the variable&rsquo;s value is used before the
operation takes place.
</p>
</dd>
<dt><code>*</code></dt>
<dd><p>Pointer dereferencing.  Defined on pointer types.  Same precedence as
<code>++</code>.
</p>
</dd>
<dt><code>&amp;</code></dt>
<dd><p>Address operator.  Defined on variables.  Same precedence as <code>++</code>.
</p>
<p>For debugging C<tt>++</tt>, <small>GDB</small> implements a use of &lsquo;<samp>&amp;</samp>&rsquo; beyond what is
allowed in the C<tt>++</tt> language itself: you can use &lsquo;<samp>&amp;(&amp;<var>ref</var>)</samp>&rsquo;
to examine the address
where a C<tt>++</tt> reference variable (declared with &lsquo;<samp>&amp;<var>ref</var></samp>&rsquo;) is
stored.
</p>
</dd>
<dt><code>-</code></dt>
<dd><p>Negative.  Defined on integral and floating-point types.  Same
precedence as <code>++</code>.
</p>
</dd>
<dt><code>!</code></dt>
<dd><p>Logical negation.  Defined on integral types.  Same precedence as
<code>++</code>.
</p>
</dd>
<dt><code>~</code></dt>
<dd><p>Bitwise complement operator.  Defined on integral types.  Same precedence as
<code>++</code>.
</p>
 
</dd>
<dt><code>.<span class="roman">, </span>-&gt;</code></dt>
<dd><p>Structure member, and pointer-to-structure member.  For convenience,
<small>GDB</small> regards the two as equivalent, choosing whether to dereference a
pointer based on the stored type information.
Defined on <code>struct</code> and <code>union</code> data.
</p>
</dd>
<dt><code>.*<span class="roman">, </span>-&gt;*</code></dt>
<dd><p>Dereferences of pointers to members.
</p>
</dd>
<dt><code>[]</code></dt>
<dd><p>Array indexing.  <code><var>a</var>[<var>i</var>]</code> is defined as
<code>*(<var>a</var>+<var>i</var>)</code>.  Same precedence as <code>-&gt;</code>.
</p>
</dd>
<dt><code>()</code></dt>
<dd><p>Function parameter list.  Same precedence as <code>-&gt;</code>.
</p>
</dd>
<dt><code>::</code></dt>
<dd><p>C<tt>++</tt> scope resolution operator.  Defined on <code>struct</code>, <code>union</code>,
and <code>class</code> types.
</p>
</dd>
<dt><code>::</code></dt>
<dd><p>Doubled colons also represent the <small>GDB</small> scope operator
(see <a href="Expressions.html#Expressions">Expressions</a>).  Same precedence as <code>::</code>,
above.
</p></dd>
</dl>
 
<p>If an operator is redefined in the user code, <small>GDB</small> usually
attempts to invoke the redefined version instead of using the operator&rsquo;s
predefined meaning.
</p>
<hr>
<div class="header">
<p>
Next: <a href="C-Constants.html#C-Constants" accesskey="n" rel="next">C Constants</a>, Up: <a href="C.html#C" accesskey="u" rel="up">C</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
 
 
 
</body>
</html>