C11 标准似乎暗示不应优化带有常量控制表达式的迭代语句。我从这个答案中得到了我的建议,它特别引用了标准草案中的第 6.8.5 节:
其控制表达式不是常量表达式的迭代语句......可能会被实现假定为终止。
在该答案中,它提到while(1) ;不应进行优化之类的循环。
那么……为什么 Clang/LLVM 优化了下面的循环(用 编译cc -O2 -std=c11 test.c -o test)?
#include <stdio.h>
static void die() {
while(1)
;
}
int main() {
printf("begin\n");
die();
printf("unreachable\n");
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上,这会打印出begin,然后在非法指令(ud2放置在 之后的陷阱die())上崩溃。在 Godbolt 上,我们可以看到调用puts.
让 Clang 输出无限循环是一项非常困难的任务-O2- 虽然我可以反复测试一个volatile变量,但这涉及到我不想要的内存读取。如果我做这样的事情:
#include <stdio.h>
static void die() {
while(1)
;
}
int main() {
printf("begin\n");
volatile int x …Run Code Online (Sandbox Code Playgroud) 我有一个字符串,我想用一个星号替换任何非标准字符或数字的字符,如(az或0-9).例如,"h ^&ell`.,| ow] {+ orld"被替换为"h*ell*o*w*orld".请注意,多个字符(如"^&")将替换为一个星号.我该怎么做呢?
我有一个简单的lambda表达式,如下所示:
x=> x.Lists.Include(l => l.Title).Where(l=>l.Title != String.Empty)
Run Code Online (Sandbox Code Playgroud)
现在,如果我想在表达式中l.InternalName != String.Empty再添加一个where子句,那么表达式是什么?
经常教授的标准数组大小的宏是
#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0]))
Run Code Online (Sandbox Code Playgroud)
或一些等效的形成.然而,当传入指针时,这种事情会默默地成功,并且在运行时看起来似乎有道理,直到事情神秘地分崩离析.
犯这个错误太容易了:一个具有局部数组变量的函数被重构,将一些数组操作移动到一个以数组作为参数调用的新函数中.
所以,问题是:是否有一个"卫生"宏来检测ARRAYSIZEC中宏的滥用,最好是在编译时?在C++中,我们只使用专门用于数组参数的模板; 在C中,似乎我们需要一些方法来区分数组和指针.(例如,如果我想拒绝数组,我只是(arr=arr, ...)因为数组赋值是非法的).
我正在使用git,我希望能够创建一个未与远程存储库同步的提交.这样的提交必须"浮动"在本地存储库中的所有其他提交之上,以避免影响历史记录.我可以使用这样的提交来存储特定于本地的更改(配置更改,调试标志,本地解决方法等).
目前,当我提交将提交重新排序回顶部时,我手动重新绑定,并且我推动使用HEAD^以避免推送本地更改.我也考虑过把这些变化放在藏匿处,但那不太方便,因为它排除了正常使用藏匿处.另一种方法是简单地将所有这些本地更改保留为未分级,并在git add -p每次我想要提交时使用.然而,随着大量琐碎的局部变化,这变得麻烦.
这是我当前工作流程的一个示例:
我的存储库最初看起来像
A---B---C---F master
Run Code Online (Sandbox Code Playgroud)
其中"F"是我的浮动提交.
我做了一个提交:
A---B---C---F---D master
Run Code Online (Sandbox Code Playgroud)
然后git rebase -i HEAD~2重新排序:
A---B---C---D---F master
Run Code Online (Sandbox Code Playgroud)
然后git push remote HEAD~1...推送除了本地F提交之外的所有内容.
更改F包含对现有版本化文件的更改,并且可能包含任意数量的更改.(如果我可以让多个提交"浮动",那就更好了,因为我可以将我的本地更改分开).
如何检索当前在WebView中显示的所有HTML内容?
我发现WebView.loadData()但我找不到相反的等价物(例如WebView.getData())
请注意,我感兴趣的检索的网页,我无法控制的数据(即我不能注入Javascript函数到这些网页,这样它会调用JavaScript接口的WebView).
无法编译(有illegal forward reference错误),正如人们所期望的那样:
class test {
int x = x + 42;
}
Run Code Online (Sandbox Code Playgroud)
但这有效:
class test {
int x = this.x + 42;
}
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?在后一种情况下分配了什么?
是否可以在特定时间调用java中的方法?例如,我有一段这样的代码:
class Test{
....
// parameters
....
public static void main(String args[]) {
// here i want to call foo at : 2012-07-06 13:05:45 for instance
foo();
}
}
Run Code Online (Sandbox Code Playgroud)
如何在java中完成这项工作?
我在PHP中找到了浮点问题的一些解决方法:
php.ini设置 precision = 14
342349.23 - 341765.07 = 584.15999999992 // floating point problem
Run Code Online (Sandbox Code Playgroud)
php.ini设置,让我们说吧 precision = 8
342349.23 - 341765.07 = 584.16 // voila!
Run Code Online (Sandbox Code Playgroud)
演示:http://codepad.org/r7o086sS
这有多糟糕?
1.如果我只需要精确的2位数计算(金钱),我可以依赖这个解决方案吗?
如果没有,你可以在这个解决方案失败时给我一个明确的例子吗?
编辑:3.哪个php.ini.precision值最适合两位数,钱计算
@Baba答案是好的,但他用precision=20,precision=6在他的测试...所以还是我不知道是不是要去工作与否.
请考虑以下事项:
让我们说precision = 8,我唯一要做的就是加法+和减法-
A + B = C
A - B = C
问题1:对于0到999999.99之间的数字,精确解决方法是否会失败,其中A和B是带小数位的数字?如果是这样,请给我一个例子.
简单的测试可以完成这项工作:
// if it fails what if I use 9,10,11 ???
// …Run Code Online (Sandbox Code Playgroud) 我知道如何使用git rebase交互式交换最后两个提交(git rebase -i HEAD~2,ddjp:x在Vim中),但我想用编程器脚本以编程方式进行,因为这是我最终经常做的事情.
更具体一点,我想重写历史
A---B---C---D HEAD
Run Code Online (Sandbox Code Playgroud)
至
A---B---D---C HEAD
Run Code Online (Sandbox Code Playgroud)
以完全脚本的方式.理想情况下,如果交换失败,它应该允许我以交互方式修复它,或者只是放弃并告诉我手动完成它.