小编Ric*_*ich的帖子

如何在使用"for"语句迭代文件对象后检测Python中的文件结尾

我知道逐行迭代一个文件,我可以使用这样的构造:

for line in file:
    do stuff
Run Code Online (Sandbox Code Playgroud)

但是,如果我在for中的某个地方也有一个break语句,一旦我不在for块中,我该如何判断是否是让我退出for for构造的中断OR它是因为我命中了文件的末尾已经?

我尝试了如何找出文件是否在其`eof`的建议?:

f.tell() == os.fstat(f.fileno()).st_size
Run Code Online (Sandbox Code Playgroud)

但这似乎不适用于我的Windows机器.基本上,f.tell()总是返回文件的大小.

python

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

return语句是否为按函数返回的函数创建临时对象?

当我学习C++ 11 rvalue引用和移动语义时,我开始对函数如何返回一个值来初始化变量感到困惑.请看以下示例:

Widget makeWidget()
{
    Widget w;
    …
    return w;
}
Widget w1 = makeWidget();
Run Code Online (Sandbox Code Playgroud)

这里我假设没有RVO(即编译不会删除复制/移动).执行return语句时return w;,执行以下功能:

1)复制初始化一个临时对象,其值成为函数的返回值,在一个众所周知的位置(一些固定的寄存器或调用者知道的内存位置)?然后调用者获取此对象以复制初始化w1?要么

2)函数获取调用者传递的内存位置w1并且函数的自动变量w用于复制初始化w1?(这是某种类型的RVO吗?还是某种内联函数行为?或者它是一种可能的调用约定?)

如果是第一种情况,并且return创建一个临时的,则会有两个复制构造函数调用,一个创建临时,一个创建w1.如果是第二种情况,则只能创建一个复制构造函数调用w1.

现在假设我们有RVO.然后,如果返回的行为是情况1),那么编译器可以通过w直接在众所周知的位置构造返回值来消除临时的复制结构.如果返回的行为类似于情况2),那么在这种情况下,RVO甚至可以w直接在分配的内存位置创建自动变量w1.我对RVO的理解是否正确?


现在让我添加移动语义.再次假设没有RVO,请看下面的例子:

Widget makeWidget()
{
    Widget w;
    …
    return std::move(w);
}
Widget w1 = makeWidget();
Run Code Online (Sandbox Code Playgroud)

现在再次针对上述两种情况:

1)我期待两个动作:第一个动作来自Widget用表达式初始化临时对象std::move(w); 第二步是来自初始化w1的temp Widget是一个rvalue?要么

2)只有一个动作:w1用表达式初始化std::move(w)? …

c++ c++11

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

Kotlin:如何验证模拟上调用了扩展函数

假设我有一个 Java 类 Metrics。我在 Kotlin 中定义了一些关于 Metrics 的扩展函数

fun Merics.expose(name: String, value: Number) {
 // do something
}
Run Code Online (Sandbox Code Playgroud)

请注意,Java 类Metrics也有一个名为的方法expose,但具有不同的签名。

我创建了一个测试,在其中模拟了一个对象并调用了应该调用metrics扩展函数的代码路径。expose但是我如何验证这些扩展函数是否被调用呢?

我尝试使用mockk和mockito-kotlin,它们似乎都不知道该metrics对象有一个用不同签名调用的新函数expose

kotlin mockk mockito-kotlin

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

在C中声明私有结构

是否可以声明仅在使用该结构的.c文件中可见的结构类型?我知道通过在外部数据对象前放置静态,可以将变量的链接更改为内部.但是可以将静态放在新结构类型的声明前面,如下所示吗?

static struct log{
            ...;
            ...;
};
typedef struct log log;
Run Code Online (Sandbox Code Playgroud)

如果不能将结构类型(例如上面的log)设置为"私有",是否意味着即使其他源文件不知道结构的名称(在我的示例中是登录)的存在,如果他们将一些变量命名为log(假设我将链接所有目标文件),仍然会发生意外名称冲突?

编辑:我不熟悉编译器/链接器的工作原理.如果存在全局变量名称日志,并且包含全局变量的文件链接到定义结构日志的唯一源文件,则链接时不会引起任何混淆,一个日志是变量名称而另一个日志是一个类型名称?

c struct private

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

将向量的向量(二维数组)重置为零

我正在使用向量的向量来模拟二维数组。为了重用这个二维数组,有时我需要将其所有元素重置为零或某个默认值。我知道对于一个简单的一维向量我可以这样做:

std::fill(v.begin(), v.end(), 0);
Run Code Online (Sandbox Code Playgroud)

如何有效地做到这一点vector<vector<int>>?我希望找到一个不使用 for 循环但更类似于某些memset变体的解决方案。我也不想进行任何内存分配和释放,因为我的目的是重用现有分配的内存。

请注意,我假设每个向量的大小是固定的并且我知道:vector<vector<int>> v(const_max_size, vector<int> (const_max_size, 0));。如何将v的元素重置为零?

注意:我不使用for循环的意思是我不想使用 v[i][j] 等下标迭代所有 2D 元素来为其分配值。

c++ vector c++11

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

将整数左移32位

在GCC下,以下代码始终返回<<if 的左操作数num1s == 0

0xFFFFFFFFu << (32-num1s);
Run Code Online (Sandbox Code Playgroud)

读完之后,为什么使用32次以上的整数时,32位整数为何不左移“ <<”?,以及David Heffernan引用的标准,似乎如果左操作数是unsigned,则它是定义的操作。仅当E1(左操作数)具有带符号的类型和非负值时,它才可能导致未定义的行为。

谁能解释标准是否明确指出,如果移位的数量大于该类型包含的位数,则它是未定义的行为

c++

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

标签 统计

c++ ×3

c++11 ×2

c ×1

kotlin ×1

mockito-kotlin ×1

mockk ×1

private ×1

python ×1

struct ×1

vector ×1