以下代码片段:
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)
为什么之间的差异cTime和ts.tv_sec?请注意,如果条件更改为 ,则不会出现此问题ts.tv_nsec >= 3000000。该问题依赖于小于 3000000 的纳秒。
我认为以下代码会导致错误,因为据我所知,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 装饰器的情况下得到一个看似有效的静态方法?”
在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第二版》的确没有明确提及这一点。
我的搜索在这个问题上变成了空白......有很多关于如何const通过发出变量的只读访问信号来帮助编译器优化的讨论,但我无法找到问题的答案标题。我对这个问题很感兴趣,因为const如果编译器可以这样做,我想避免考虑使用优化。
我很欣赏即使编译器能够找到不变的值并将它们优化为只读访问,在某些情况下,使用const仍然会有所帮助。我只是在广泛地寻找有关编译器功能的答案 - GCC 优化器是否在不使用 的情况下寻找不变的值const?
使用以下简单的代码片段:
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, …