小编The*_*'Or的帖子

为什么 C 代码中 time() 报告的时间有时比 timespec_get() 的秒部分晚 1 秒?

以下代码片段:

struct timespec ts;
for (int x = 0; x < 100000000; x++) {
    timespec_get(&ts, TIME_UTC);
    long cTime = (long) time(NULL);
    if (cTime != ts.tv_sec && ts.tv_nsec < 3000000) {
        printf("cTime: %ld\n", cTime);
        printf("ts.tv_sec: %ld\n", ts.tv_sec);
        printf("ts.tv_nsec: %ld\n", ts.tv_nsec);
    }
}
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

...
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2527419
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2534036
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2540359
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2547039
...
Run Code Online (Sandbox Code Playgroud)

为什么之间的差异cTimets.tv_sec?请注意,如果条件更改为 ,则不会出现此问题ts.tv_nsec >= 3000000。该问题依赖于小于 3000000 的纳秒。

c time posix timespec

12
推荐指数
1
解决办法
145
查看次数

为什么在没有“self”且没有装饰器的情况下声明 Python 类的方法不会引发异常?

我认为以下代码会导致错误,因为据我所知,Python 类中的方法必须将“self”(或任何其他标签,但按照约定是“self”)作为其第一个参数,或者如果使用了@classmethod装饰器,则为“cls”或类似名称,如果使用了装饰器,则为 none @staticmethod

为什么我在终端中使用 Python 3.5 运行它没有错误,即使test_method不满足这些要求?它似乎作为静态方法工作正常,但没有装饰器。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys

class MyClass:

    def test_method(args):
        print(args[1])

    @staticmethod
    def static_method():
        print("static_method")

    @classmethod
    def class_method(cls):
        print("class_method")


def main(args):
    MyClass.test_method(args)


if __name__ == '__main__':
    sys.exit(main(sys.argv))
Run Code Online (Sandbox Code Playgroud)

输出:

$ python3 testscript.py "testing"
$ testing
Run Code Online (Sandbox Code Playgroud)

编辑

我的问题也可以用不同的措辞,将注意力从self和转移到@staticmethod:“我怎么会在没有 @staticmethod 装饰器的情况下得到一个看似有效的静态方法?”

python methods static-methods class class-method

8
推荐指数
2
解决办法
6238
查看次数

在C中声明一个函数名称和功能块之间的变量如何编译为有效?

C lang FAQ中,我找到了以下代码:

void f(ipp)
int **ipp;
{
    static int dummy = 5;
    *ipp = &dummy;
}
Run Code Online (Sandbox Code Playgroud)

我测试了使用-Wall -std=c11 -pedantic标志进行编译,并且没有警告或错误的情况下进行了编译。这怎么可能-在函数名称及其块之间声明一个变量?

编辑

发布几小时后,经过一系列回答,我发现问题已重复存在。我不同意关闭的决定。实际上,到目前为止,重复的问答和此处给出的答案虽然大体上是正确的,但并未具体回答我的问题。

我的查询是关于函数名称及其块之间出现的变量声明。好的,那是原始的K&R风格,但是我仍然觉得声明的位置令人震惊。阅读了描述ANSI C89的K&R第二版书后,我知道以前的样式允许使用不同的方法来声明函数参数,但是AFAIK那本书没有显示以这种方式进行的声明。也许是这样,我已经忘记了。

我认为,最好单独就这个特定问题提出一个问题,以防将来有人被它抛弃。我的问题应该代表任何可以阐明如何决定允许在此陌生位置声明参数的人。您从C语言和所有受C语言启发的语言中获得的印象是,令牌及其大括号之间没有任何联系。我的问题提请您注意一个重要的例外情况,即使该例外已存在30/40年,也应予以强调并理解其原理。

编辑2

现在,我发现C ++语法允许在函数名称及其块之间插入标记。即便如此,整个声明行介于两者之间的想法更为严格,值得向C新手指出,因为他们可能会遇到一些怪癖。我已经检查过,《 K&R第二版》的确没有明确提及这一点。

c c11 function-definition

3
推荐指数
1
解决办法
125
查看次数

使用 &lt;stdatomic.h&gt; 在 C11 GCC 中使数据读/写原子化?

我从此处此处的 SO 线程等了解到,假设多线程应用程序中的数据读/写在操作系统/硬件级别是原子的是不安全的,并且可能会导致数据损坏。我想知道在 Linux 上使用 C11 库和 GCC 编译器来实现int变量原子读写的最简单方法。<stdatomic.h>

如果我当前int在线程中有一个分配:messageBox[i] = 2,如何使该分配原子化?同样适用于阅读测试,例如if (messageBox[i] == 2).

c multithreading atomic c11

3
推荐指数
1
解决办法
1422
查看次数

C 优化编译器 (GCC) 是否能够在不使用“const”的情况下检测只读访问的不变值?

我的搜索在这个问题上变成了空白......有很多关于如何const通过发出变量的只读访问信号来帮助编译器优化的讨论,但我无法找到问题的答案标题。我对这个问题很感兴趣,因为const如果编译器可以这样做,我想避免考虑使用优化。

我很欣赏即使编译器能够找到不变的值并将它们优化为只读访问,在某些情况下,使用const仍然会有所帮助。我只是在广泛地寻找有关编译器功能的答案 - GCC 优化器是否在不使用 的情况下寻找不变的值const

c compiler-optimization readonly-variable

2
推荐指数
1
解决办法
71
查看次数

在 Linux 上使用“timespec_get()”返回的“tv_nsec”纳秒分量作为 C 中的随机数生成器的可行性?

使用以下简单的代码片段:

struct timespec ts;
for (int i = 0; i < 100; i++) {
    timespec_get(&ts, TIME_UTC);
    printf("%ld, ", ts.tv_nsec % 100);
}
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出:

58, 1, 74, 49, 5, 59, 89, 20, 52, 86, 17, 48, 79, 10, 41, 73, 3, 40, 72, 3, 36, 67, 98, 30, 61, 92, 24, 55, 86, 17, 49, 82, 14, 45, 76, 7, 40, 72, 3, 36, 71, 2, 35, 66, 97, 28, 66, 97, 28, 60, 90, 22, 52, 83, 15, 46, 77, …

c random timespec

0
推荐指数
1
解决办法
241
查看次数