小编nne*_*neo的帖子

我如何制作一个不会被优化掉的无限空循环?

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)

c clang compiler-optimization language-lawyer

141
推荐指数
6
解决办法
3万
查看次数

替换字符串中的所有非字母数字字符

我有一个字符串,我想用一个星号替换任何非标准字符或数字的字符,如(az或0-9).例如,"h ^&ell`.,| ow] {+ orld"被替换为"h*ell*o*w*orld".请注意,多个字符(如"^&")将替换为一个星号.我该怎么做呢?

python

85
推荐指数
4
解决办法
9万
查看次数

Lambda表达式中的多个Where子句

我有一个简单的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子句,那么表达式是什么?

.net c# lambda

50
推荐指数
3
解决办法
15万
查看次数

拒绝指针的数组大小的宏

经常教授的标准数组大小的宏是

#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0]))
Run Code Online (Sandbox Code Playgroud)

或一些等效的形成.然而,当传入指针时,这种事情会默默地成功,并且在运行时看起来似乎有道理,直到事情神秘地分崩离析.

犯这个错误太容易了:一个具有局部数组变量的函数被重构,将一些数组操作移动到一个以数组作为参数调用的新函数中.

所以,问题是:是否有一个"卫生"宏来检测ARRAYSIZEC中宏的滥用,最好是在编译时?在C++中,我们只使用专门用于数组参数的模板; 在C中,似乎我们需要一些方法来区分数组和指针.(例如,如果我想拒绝数组,我只是(arr=arr, ...)因为数组赋值是非法的).

c arrays macros c-preprocessor

49
推荐指数
4
解决办法
1万
查看次数

如何在git中执行"仅本地提交"?

我正在使用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包含对现有版本化文件的更改,并且可能包含任意数量的更改.(如果我可以让多个提交"浮动",那就更好了,因为我可以将我的本地更改分开).

git

45
推荐指数
4
解决办法
1万
查看次数

如何从WebView检索HTML内容(作为字符串)

如何检索当前在WebView中显示的所有HTML内容?

我发现WebView.loadData()但我找不到相反的等价物(例如WebView.getData())

请注意,我感兴趣的检索的网页,我无法控制的数据(即我不能注入Javascript函数到这些网页,这样它会调用JavaScript接口的WebView).

android webview android-webview

36
推荐指数
4
解决办法
9万
查看次数

当我添加"this"时,递归初始化程序是否有效?

无法编译(有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

35
推荐指数
2
解决办法
827
查看次数

如何在java中的特定时间调用方法?

是否可以在特定时间调用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中完成这项工作?

java

28
推荐指数
3
解决办法
5万
查看次数

我可以依赖PHP php.ini精确解决方案来解决浮点问题

我在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值最适合两位数,钱计算


  • 请注意我不能使用整数计算(浮点数*100 =美分),这太迟了.
  • 我不打算处理高于10 ^ 6的数字
  • 我不需要比较数字

UPDATE

@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)

php floating-point

28
推荐指数
2
解决办法
2万
查看次数

以编程方式交换最后两次提交

我知道如何使用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)

以完全脚本的方式.理想情况下,如果交换失败,它应该允许我以交互方式修复它,或者只是放弃并告诉我手动完成它.

git

25
推荐指数
2
解决办法
5100
查看次数