断言及静态断言
<p>在c++11之前就已经有了断言,但是不是静态断言。</p><h2 id="断言">断言</h2>
<p>断言是一种编程中常用的手段。在通常情况下,断言就是将一个返回值总是需要为真的判断表达式放在语句中,用于排除在设计的逻辑上不应该产生的情况。</p>
<p>一个函数总需要输入在一定的范围内的参数,那么程序员就可以对该参数使用断言,以迫使在该参数发生异常的时候程序退出,从而避免程序陷入逻辑的混乱。</p>
<p>从一些意义上讲,断言并不是正常程序所必需的,不过对于程序调试来说,通常断言能够帮助程序开发者快速定位那些违反了某些前提条件的程序错误。</p>
<p>如果我们要在C++程序中使用断言,需要在<strong>程序中包含头文件</strong><code><cassert></code>或<code><assert.h></code>,头文件中为我们提供了 assert 宏,用于在运行时进行断言。</p>
<p>举例说明:下面的代码将创建一个数组,但是如果数组的size小于等于0,这个数组将无法被创建,那么用assert捕捉中断程序。</p>
<pre><code class="language-c++">#include <iostream>
#include <cassert>
using namespace std;
char* createArray(int size) {//创建一个指定size大小的char类型数组
assert(size > 0); //通过断言判断数组大小是否大于0 必须大于0,否则程序中断
char* array = new char;
return array;
}
int main() {
char* buf = createArray(10);
system("pause");
return 0;
}
</code></pre>
<p>在程序的第6行,使用了断言<code>assert(expression)</code> ,这是一个宏,它的参数是一个表达式,这个表达式通常返回一个布尔类型的值,并且要求表达式必须为 true 程序才能继续向下执行,否则会直接中断。</p>
<p>如果<code>createArray</code>参数<code>size>0</code> , 程序正常运行直到结束。</p>
<p>如果<code>createArray</code>参数<code>size<=0</code> , 程序会中断。</p>
<p><strong>但是上面的断言必须在执行之后才能知道,在编译之后也不会知道这个断言的结果。</strong>这意味着不运行程序我们将无法得知某些条件是否是成立的。比如操作系统的类型,是win还是linux。</p>
<h2 id="静态断言">静态断言</h2>
<p>c++11提供了静态断言</p>
<p>静态断言<code>static_assert(断言表达式,警告信息字符串)</code>。</p>
<p>所谓静态就是在<strong>编译时</strong>就能够进行检查的断言,而不是只有在执行之后才得知结果,使用时<strong>不需要引用头文件</strong>。</p>
<p>静态断言的另一个好处是,可以自定义违反断言时的错误提示信息。</p>
<p>静态断言使用起来非常简单,它接收两个参数:</p>
<ul>
<li>参数1:断言表达式,这个表达式通常需要返回一个 bool值;</li>
<li>参数2:警告信息字符串,它通常就是一段字符串,在违反断言(表达式为false)时提示该信息。</li>
</ul>
<p>这样就可以在执行之前就知道操作系统是32位的win还是64位的linux:</p>
<pre><code class="language-c++">#include <iostream>
using namespace std;
int main() {
//static_assert(断言的条件,断言的提示信息,)
static_assert(sizeof(long) == 8, "当前操作系统不是64位的"); //在win中这行代码会报错,但是在linux中不会。
cout << "Hello world " << endl; //用来看看是不是能执行之后的代码
return 0;
}
</code></pre>
<h2 id="补充32位系统和64位系统的数据类型对比">补充32位系统和64位系统的数据类型对比:</h2>
<table>
<thead>
<tr>
<th>整型名称</th>
<th>(> 16 位 Windows)占用字节数 <br>[数据范围]</th>
<th>(32 位 Linux)占用字节数 <br>[数据范围]</th>
<th>(64 位 Linux)占用字节数<br>[数据范围]</th>
</tr>
</thead>
<tbody>
<tr>
<td>int(signed 、signed int)</td>
<td>4字节<br>[-2<sup>31</sup>,2<sup>31</sup>-1]<br>INT_MIN=-2147483648<br>INT_MAX=2147483647</td>
<td>4字节<br>[-2<sup>31</sup>,2<sup>31</sup>-1]<br>INT_MIN=-2147483648<br>INT_MAX=2147483647</td>
<td>4字节<br>[-2<sup>31</sup>,2<sup>31</sup>-1]<br>INT_MIN=-2147483648<br>INT_MAX=2147483647</td>
</tr>
<tr>
<td>unsigned int(unsigned)</td>
<td>4字节<br><br>UINT_MAX=4294967295</td>
<td>4字节<br><br>UINT_MAX=4294967295</td>
<td>4字节<br><br>UINT_MAX=4294967295</td>
</tr>
<tr>
<td>short(short int、signed short 、signed short int)</td>
<td>2字节<br>[-2<sup>15</sup>,2<sup>15</sup>-1]<br>SHRT_MIN=-32768<br>SHRT_MAX=32767</td>
<td>2字节<br>[-2<sup>15</sup>,2<sup>15</sup>-1]<br>SHRT_MIN=-32768<br>SHRT_MAX=32767</td>
<td>2字节<br>[-2<sup>15</sup>,2<sup>15</sup>-1]<br>SHRT_MIN=-32768<br>SHRT_MAX=32767</td>
</tr>
<tr>
<td>unsigned short(unsigned short int)</td>
<td>2字节<br><br>USHRT_MAX=65535</td>
<td>2字节<br><br>USHRT_MAX=65535</td>
<td>2字节<br><br>USHRT_MAX=65535</td>
</tr>
<tr>
<td>long(long int、signed long、signed long int)</td>
<td>4字节<br>[-2<sup>31</sup>,2<sup>31</sup>-1]<br>LONG_MIN=-2147483648<br>LONG_MAX=2147483647</td>
<td>4字节<br>[-2<sup>31</sup>,2<sup>31</sup>-1]<br>LONG_MIN=-2147483648<br>LONG_MAX=2147483647</td>
<td>8字节<br>[-2<sup>63</sup>,2<sup>63</sup>-1]<br>LONG_MIN=-9223372036854775808<br>LONG_MAX=9223372036854775807</td>
</tr>
<tr>
<td>unsigned long(unsigned long int)</td>
<td>4字节<br><br>ULONG_MAX=4294967295</td>
<td>4字节<br><br>ULONG_MAX=4294967295</td>
<td>8字节<br><br>ULONG_MAX=18446744073709551615</td>
</tr>
<tr>
<td>long long(long long int、signed long long、signed long long int)</td>
<td>8字节<br>[-2<sup>63</sup>,2<sup>63</sup>-1]<br>LLONG_MIN=-9223372036854775808<br>LLONG_MAX=9223372036854775807</td>
<td>8字节<br>[-2<sup>63</sup>,2<sup>63</sup>-1]<br>LLONG_MIN=-9223372036854775808<br>LLONG_MAX=9223372036854775807</td>
<td>8字节<br>[-2<sup>63</sup>,2<sup>63</sup>-1]<br>LLONG_MIN=-9223372036854775808<br>LLONG_MAX=9223372036854775807</td>
</tr>
<tr>
<td>unsigned long long(unsigned long long int)</td>
<td>8字节<br><br>ULLONG_MAX=18446744073709551615</td>
<td>8字节<br><br>ULLONG_MAX=18446744073709551615</td>
<td>8字节<br><br>ULLONG_MAX=18446744073709551615</td>
</tr>
<tr>
<td>*(指针变量)</td>
<td>4字节</td>
<td>4字节</td>
<td>8字节</td>
</tr>
</tbody>
</table><br><br>
来源:https://www.cnblogs.com/ggkx/p/19575158
頁:
[1]