-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathc_cpp.html
227 lines (217 loc) · 14.9 KB
/
c_cpp.html
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>c & c++ — myhome 1.0.0 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="top" title="myhome 1.0.0 documentation" href="index.html" />
<link rel="next" title="git" href="git.html" />
<link rel="prev" title="bash" href="bash.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="git.html" title="git"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="bash.html" title="bash"
accesskey="P">previous</a> |</li>
<li><a href="index.html">myhome 1.0.0 documentation</a> »</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="c-c">
<h1>c & c++<a class="headerlink" href="#c-c" title="Permalink to this headline">¶</a></h1>
<div class="section" id="printf-d-d-d-d-i-i-i-i">
<h2>printf(“%d,%d,%d,%d”,i++,++i,i++,i++)<a class="headerlink" href="#printf-d-d-d-d-i-i-i-i" title="Permalink to this headline">¶</a></h2>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">5</span><span class="p">;</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"%d,%d,%d,%d"</span><span class="p">,</span><span class="n">i</span><span class="o">++</span><span class="p">,</span><span class="o">++</span><span class="n">i</span><span class="p">,</span><span class="n">i</span><span class="o">++</span><span class="p">,</span><span class="n">i</span><span class="o">++</span><span class="p">);</span>
</pre></div>
</div>
<p>下面给出几个编译器编译运行得到的结果:</p>
<div class="highlight-python"><div class="highlight"><pre>gcc:8,9,6,5(加-Wall选项得到warning:operation on ''i'' may be undefined
icc:5,7,7,8
clang:5,7,7,8 (warning: multiple unsequenced )modifications
opencc: 5,9,7,8 (加-Wall编译选项也得到warning)
</pre></div>
</div>
<p>原因在于:在C/C++标准中,函数参数的运算顺序是没有特殊定义的,而是有编译器自己设定。
因此,不要纠结这种问题,而且编程中也应尽量避免这种情况的出现,即不要在一表达式(如:i=(i++)+(++i))或函数中出现多个这种计算。</p>
<p>可以查看C sequence points相关内容:<a class="reference external" href="http://msdn.microsoft.com/en-us/library/azk8zbxd.aspx">http://msdn.microsoft.com/en-us/library/azk8zbxd.aspx</a></p>
</div>
<div class="section" id="getsfgets">
<h2>字符串数组越界(gets、fgets)<a class="headerlink" href="#getsfgets" title="Permalink to this headline">¶</a></h2>
<p>编译时,不会检查是否越界,而putchar()或%s输出时只在遇到’‘0’‘时停止,当字符串数组越界时,越界较短情况下,可能不会报错,而且输出完整的值,但如果越界很多,则会报错,而越界后继续访问内存,很可能会造成严重后果。所以,需要人为控制内存溢出问题,给字符串用memset()赋初值,人为给字符串终止符’‘0’‘留个位置,注意下标等等。</p>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">char</span> <span class="n">b</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="sc">'i'</span><span class="p">,</span> <span class="sc">'s'</span><span class="p">};</span> <span class="c1">// 假设忘记添加结束符\0</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"字符串b:%s"</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span> <span class="c1">// 输出字符串b,很可能出现不可知的错误。</span>
<span class="kt">char</span> <span class="n">p</span><span class="p">[][</span><span class="mi">3</span><span class="p">]</span><span class="o">=</span><span class="p">{</span><span class="s">"abc"</span><span class="p">,</span><span class="s">"def"</span><span class="p">};</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"%s"</span><span class="p">,</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="c1">// 将输出abcdef</span>
</pre></div>
</div>
<p>使用gets()时,可以无限读取,如果定义的数组空间较小,容易发生溢出,多出来的字符会覆盖堆栈中原先的内容,因此少用或不用gets()函数,而改用fgets()。</p>
</div>
<div class="section" id="getchar">
<h2>getchar()<a class="headerlink" href="#getchar" title="Permalink to this headline">¶</a></h2>
<p>程序运行到a=getchar()函数时,等待键盘输入,(行缓冲模式下)输入一串字符后回车,将字符串(含回车)送入缓存区并将第一个字符返回给变量a,“删除”第一个字符(实际是指针后移一位),如果缓存区内已有字符,则getchar()自动从缓冲区获得一个字符,而无需键盘输入。例:</p>
<div class="highlight-c"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8</pre></div></td><td class="code"><div class="highlight"><pre><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="kt">char</span> <span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">;</span>
<span class="n">a</span><span class="o">=</span><span class="n">getchar</span><span class="p">();</span>
<span class="n">b</span><span class="o">=</span><span class="n">getchar</span><span class="p">();</span>
<span class="n">prinf</span><span class="p">(</span><span class="s">"%c%c"</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">);</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
<p>键盘输入:</p>
<blockquote>
<div>c回车</div></blockquote>
<p>则缓冲区内字符为:”c\n”;</p>
<p>因此: a=’c’,b=’\n’;</p>
</div>
<div class="section" id="id1">
<h2>二维数组作为函数参数<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
<div class="highlight-c"><div class="highlight"><pre>int a[m][n]; // m,n已知
a[i][j]地址为:
a+i*n+j; // 因此对于多维数组,必须给定二维或更高维的大小。
</pre></div>
</div>
<p>传递二维数组的几种常见方法:</p>
<ul>
<li><p class="first">形参给出第二维的长度</p>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">func</span><span class="p">(</span><span class="kt">char</span> <span class="n">str</span><span class="p">[][</span><span class="mi">5</span><span class="p">]);</span>
<span class="kt">char</span> <span class="n">str</span><span class="p">[][</span><span class="mi">5</span><span class="p">]</span><span class="o">=</span><span class="p">{</span><span class="s">"abc"</span><span class="p">,</span><span class="s">"def"</span><span class="p">,</span><span class="s">"ghi"</span><span class="p">};</span>
<span class="n">func</span><span class="p">(</span><span class="n">str</span><span class="p">);</span>
</pre></div>
</div>
</li>
<li><p class="first">形参为指向数组的指针</p>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">func</span><span class="p">(</span><span class="kt">char</span> <span class="p">(</span><span class="o">*</span><span class="n">str</span><span class="p">)[</span><span class="mi">5</span><span class="p">]);</span> <span class="c1">// 注意(*str)前后括号</span>
<span class="c1">// [5]表示每个字符串最多5个字符,</span>
<span class="c1">// 由于字符串最后一个应为'\0',因此实际上最好只存4个字符,否则用printf输出有问题。</span>
<span class="kt">char</span> <span class="n">str</span><span class="p">[][</span><span class="mi">5</span><span class="p">]</span><span class="o">=</span><span class="p">{</span><span class="s">"abc"</span><span class="p">,</span><span class="s">"def"</span><span class="p">,</span><span class="s">"ghi"</span><span class="p">};</span>
<span class="n">func</span><span class="p">(</span><span class="n">str</span><span class="p">);</span>
</pre></div>
</div>
</li>
<li><p class="first">形参为指针数组</p>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">func</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span> <span class="n">str</span><span class="p">[</span><span class="mi">5</span><span class="p">]);</span>
<span class="kt">char</span> <span class="o">*</span> <span class="n">str</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">=</span><span class="p">{</span><span class="s">"abc"</span><span class="p">,</span><span class="s">"def"</span><span class="p">,</span><span class="s">"ghijklm"</span><span class="p">};</span> <span class="c1">// str为5个指向字符串的指针</span>
<span class="n">func</span><span class="p">(</span><span class="n">str</span><span class="p">);</span>
</pre></div>
</div>
</li>
<li><p class="first">形参为指针的指针</p>
<div class="highlight-c"><div class="highlight"><pre><span class="kt">void</span> <span class="nf">func</span><span class="p">(</span><span class="kt">char</span> <span class="o">**</span><span class="n">str</span><span class="p">);</span>
<span class="kt">char</span> <span class="n">str</span><span class="p">[][</span><span class="mi">5</span><span class="p">]</span><span class="o">=</span><span class="p">{</span><span class="s">"abc"</span><span class="p">,</span><span class="s">"def"</span><span class="p">,</span><span class="s">"ghi"</span><span class="p">};</span>
<span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">=&</span><span class="n">str</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
<span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">=</span><span class="n">str</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
<span class="n">p</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">=</span><span class="n">str</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
<span class="n">func</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
<span class="c1">// 或</span>
<span class="kt">char</span> <span class="o">*</span><span class="n">str</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="c1">// 声明</span>
</pre></div>
</div>
</li>
<li><p class="first">c++里使用二维向量</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">vector</span><span class="o"><</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">>></span> <span class="n">array</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span>
</pre></div>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">c & c++</a><ul>
<li><a class="reference internal" href="#printf-d-d-d-d-i-i-i-i">printf(“%d,%d,%d,%d”,i++,++i,i++,i++)</a></li>
<li><a class="reference internal" href="#getsfgets">字符串数组越界(gets、fgets)</a></li>
<li><a class="reference internal" href="#getchar">getchar()</a></li>
<li><a class="reference internal" href="#id1">二维数组作为函数参数</a></li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="bash.html"
title="previous chapter">bash</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="git.html"
title="next chapter">git</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/c_cpp.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="git.html" title="git"
>next</a> |</li>
<li class="right" >
<a href="bash.html" title="bash"
>previous</a> |</li>
<li><a href="index.html">myhome 1.0.0 documentation</a> »</li>
</ul>
</div>
<div class="footer">
© Copyright 2014, conderls.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
</div>
</body>
</html>