我在C++编写一个程序来找到所有的解决方案一b = c ^,其中一个,b和c ^一起使用所有的数字0-9只出现一次.该方案在循环值一和b,并且在每次跑了数字计数程序一,b和一个b以检查是否数字的条件感到满意.
然而,当可以产生伪解一个b溢出整数限制.我最终使用以下代码检查:
unsigned long b, c, c_test;
...
c_test=c*b; // Possible overflow
if (c_test/b != c) {/* There has been an overflow*/}
else c=c_test; // No overflow
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来测试溢出?我知道有些芯片有一个内部标志,当溢出发生时会设置,但我从未见过通过C或C++访问它.
请注意,在C和C++中,签名 int溢出是未定义的行为,因此您必须在不实际导致它的情况下检测它.有关添加前的signed int overflow,请参阅在C/C++中检测带符号的溢出
在查看Visual C++代码库时,我发现了以下奇怪的事情.在编译时可以评估条件的情况下,使用运行时断言(检查条件并在违反条件时抛出异常):
assert( sizeof( SomeType ) == sizeof( SomeOtherType ) );
Run Code Online (Sandbox Code Playgroud)
很明显,编译器将评估条件并替换有效的代码
assert( true );
Run Code Online (Sandbox Code Playgroud)
什么都不做或
assert( false );
Run Code Online (Sandbox Code Playgroud)
每次控件通过该行时都会抛出异常.
IMO应该使用编译时断言,原因如下:
看起来像编译时断言是唯一正确的事情.有没有可能的理由在这里更喜欢运行时断言?