- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想遍历 signed int
的所有可能值,来自 INT_MIN
至 INT_MAX
.明显的代码
for (int x = INT_MIN; x <= INT_MAX; x++)
do_something(x);
int x = INT_MIN;
do {
do_something(x);
} while (x++ < INT_MAX);
clang -O2 -fsanitize=undefined
正确报告
runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int'
, 而
gcc -O2 -fsanitize=undefined
才不是。我想
gcc
的
-fsanitize=signed-integer-overflow
碎成
-ftrapv
.
goto
:
int x = INT_MIN;
loop: {
do_something(x);
if (x < INT_MAX) {
x++;
goto loop;
}
}
break
手动输入:
int x = INT_MIN;
while (1) {
do_something(x);
if (x < INT_MAX)
x++;
else
break;
}
int x = INT_MIN;
do {
do_something(x);
} while (x < INT_MAX && ++x != INT_MIN);
do-while
一种可以使用的解决方案
while (x < INT_MAX && (++x, 1));
反而。
goto
版本,我不喜欢
do-while
版本非常多(尤其是
++x != INT_MIN
位...),但总的来说我更喜欢
while (1)
版本。我的问题如下。
while (1)
万一循环 do_something
不执行输入/输出操作,也不访问 volatile 对象?
#include <stdio.h>
#include <limits.h>
int add_wrap_unsigned(int x, int y) {
return (unsigned) x + (unsigned) y;
}
int add_wrap_builtin(int x, int y) {
int res;
__builtin_add_overflow(x, y, &res);
return res;
}
int check() {
int x = INT_MIN;
while (1) {
if (add_wrap_unsigned(x, 1) != add_wrap_builtin(x, 1))
return 1;
if (x < INT_MAX)
x++;
else
break;
}
return 0;
}
int main() {
if (check())
printf("counterexample found");
else
printf("no counterexample");
return 0;
}
no counterexample
与
clang .
check
被编译成一个简单的
return 0
.但是,更改单行(第 22 行从
break;
到
x = INT_MIN;
)
changes completely the behavior :
check
变成 noop 无限循环,但
main
现在打印
counterexample found
.即使使用
-std=c11
,这一切也会发生.
最佳答案
问题是是否允许 C 编译器删除无限循环。不,不允许删除控制表达式为常量( for (;;) {}
或 while (1) { }
)的无限循环,但 C 标准 明确说明 在 C11/C17 6.8.5p6那
- An iteration statement whose controlling expression is not a constant expression,156) that performs no input/output operations, does not access volatile objects, and performs no synchronization or atomic operations in its body, controlling expression, or (in the case of a for statement) its expression-3, may be assumed by the implementation to terminate.157)
break
:
for (int x = INT_MIN; ; x++) {
do_something(x);
if (x == INT_MAX) break;
}
-O3
Clang 9.0将其编译为相当于
for (int x = INT_MIN; x != INT_MIN; x++)
do_something(x)
int x = INT_MIN;
do_something(x);
do {
do_something(++x);
} while (x < INT_MAX);
关于C:如何迭代 `signed int` 的所有可能值,从 `INT_MIN` 到 `INT_MAX` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59327636/
降本手段一招鲜,增效方法吃遍天; 01 互联网行业里; 降本策略千奇百怪,手段却出奇一致;增效方法五花八门,手段更是花里胡哨; 对于企业来说;
有什么方法可以使用 angularjs 中的部分进行代码分组吗? 原因 --- 我的 Controller 包含太多代码。该 Controller 包含了多个方法和大量功能的代码,降低了代码的可读性。
不幸的是,我的数据库的数据模型必须改变,所以我正在寻找最轻松的方式来迁移我的数据。 此时情况如何: create table cargo{ id serial primary key, per
在 QTextEdit 对象中,假设我想知道字符在鼠标光标下的位置。 我会写... void MyQTextEditObject::mousePressEvent(QMouseEvent* mouse
是否可以在 C++ 中返回一个 return 语句或做一些具有类似功能的事情? 例如,如果代码中有几个函数将指针作为输入,并且每个函数都检查指针是否为 nullptr,这将很方便。如果它是一个 nul
我的 PC 上有一个控制台应用程序,它是 signalR 服务器。 我有一个 html 页面,它是互联网上的 signalR 客户端。但我尝试连接服务器,但我有一个错误的请求 400 错误。如果服务器
我想将应用程序作为后台进程运行。当点击应用程序图标时,它不会显示任何 View ,只会启动后台进程。 最佳答案 对于 iOS 这是不可能的,但是对于 android,react native 有 he
我知道有(昂贵的)框架可以让你在 VS C# 中编写 android 应用程序并将其编译为 android apk。 我也知道,可以在 VS 中编写 Java 应用程序(link)。 是否有可能,甚至
我在做: can :manage, :all if user.role == 'admin' can :approve, Anuncio do |anuncio| anuncio.try(:apr
我是一名优秀的程序员,十分优秀!