我目前正在向一些相当年轻的学生教授一些python编程。我希望他们学习的一件事是如何编写for循环。
到目前为止,我向学生展示的方式是这样的:
for i in range(1,11):
print(i)
Run Code Online (Sandbox Code Playgroud)
这给出了一个i从1到10 的循环。
我的问题是,对于学生来说,range(1,11)当他们希望循环上升到10时,他们需要写11作为第二个参数,这对学生来说似乎很奇怪。学生们发现这令人困惑。
在C / C ++和相关语言中,这样的循环可以这样写:
for(int i = 1; i <= 10; i++)
{ /* do something */ }
Run Code Online (Sandbox Code Playgroud)
在我看来,表达循环的C ++方法更直观,因为在那种情况下,我可以显式编写1和10,这是我希望循环变量采用的第一个和最后一个值。
当在python中使用for循环时,我最终告诉学生,诸如“我们只想接受要在循环数达到10时编写11的代码,这有点烦人,但您只需要学习范围功能以这种方式起作用”。我对此不满意;我希望他们了解编程很有趣,而且恐怕这种事情会使它变得不那么有趣。
由于python通常被描述为强调可读性的语言,因此我怀疑有一种更好的方式来表达for循环,这种方式不会给我的学生造成混乱。
有没有更好和/或更少混淆的方法来用python语言表达这种for循环?
我在名为 test.cc 的文件中包含以下小型 C++ 代码:
#include <iostream>
int main() {
long double x = 3.3;
std::cout << x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
以正常方式编译(简单地 g++ test.cc)工作正常。
但是,当尝试使用 -mlong-double-128 选项时,存在链接问题:
$ g++ -mlong-double-128 test.cc
/tmp/cccKog5D.o: In function `main':
test.cc:(.text+0x1f): undefined reference to `std::ostream::operator<<(__float128)'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我尝试添加 -lquadmath 但问题仍然存在。
我用 g++ 5.4.0 和 6.1.0 版本尝试过此操作,两者的行为相同。
每当使用 << 运算符时,都可以通过强制转换为 double 来解决该问题,但我真的很想让它在不这样做的情况下工作。(背景是我有一个更大的研究代码,我希望能够使用 -mlong-double-128 进行编译以获得更高的精度,但由于这个问题而失败。)
关于如何解决这个问题有什么想法吗?
编辑:
现在我发现按照 @Niall 的建议使用 -mlong-double-128 重新编译 libstdc++ 库可以解决链接问题。
我下载了libstdc++源代码(gcc-6.1.0.tar.gz包的一部分)并配置如下:
../configure --enable-cxx-flags=-mlong-double-128 --prefix=/home/elias/slask/inst --disable-multilib
Run Code Online (Sandbox Code Playgroud)
然后,使用生成的 libstdc++.a 库文件,我可以构建我的 …
在 Linux 中,当正在运行的程序尝试使用超过限制的堆栈空间(堆栈溢出)时,通常会导致“分段错误”错误并中止执行。
是否保证超出堆栈空间限制总是会导致分段错误错误?或者程序是否会继续运行,但可能由于数据损坏而出现一些错误行为?
另一种说法是:如果一个程序行为不当,产生了错误的结果,但没有崩溃,那么原因仍然是堆栈溢出吗?
编辑:澄清一下,这个问题不是关于“堆栈缓冲区溢出”,而是关于堆栈溢出,当程序使用的堆栈空间超过堆栈大小限制(Linux 中由 给出的限制ulimit -s)时。