常见的std :: cin用法
int X;
cin >> X;
Run Code Online (Sandbox Code Playgroud)
这样做的主要缺点是X不能const.它很容易引入错误; 我正在寻找一些技巧来创建一个const值,并只写一次.
天真的解决方案
// Naive
int X_temp;
cin >> X_temp;
const int X = X_temp;
Run Code Online (Sandbox Code Playgroud)
你可以通过改变X来明显改善它const&; 仍然可以修改原始变量.
我正在寻找一个如何做到这一点的简短而聪明的解决方案.我相信我不是唯一一个能从这个问题的答案中获益的人.
//编辑:我希望解决方案可以轻松扩展到其他类型(比方说,所有POD,std::string以及带有普通构造函数的可移动可复制类)(如果没有意义,请在评论中告诉我) .
浏览https://wiki.haskell.org/IO_inside时,我遇到了以下评论和代码......
"而且,Haskell布局规则允许我们使用以下布局:
Run Code Online (Sandbox Code Playgroud)main = do a <- readLn if (a>=0) then return () else do print "a is negative" ...这可能有助于逃避冗长的"做"声明."
此后,我将使用符号C*来指代上述代码.
我认为C*的意图是读取一个数字,然后:
(i)如果它是非负的,则什么都不做.
(ii)如果是负数,则显示输出,表明它是.
我最初的反应是认为C*要么不能正确解析,要么不会按预期运行.
我认为布局会在第二个'do'之后立即插入一组空括号和一个分号,因为lexeme'print'的缩进比'a <中'a'所建立的当前布局上下文的缩进级别更多. - readLn".
也就是说,我对Layout生成的布局不敏感代码(以下称为C')的预测将类似于:
main = do {
a <- readLn;
if (a>=0) then return ()
else do {};
print "a is negative"
...
}
Run Code Online (Sandbox Code Playgroud)
我认为情况就是这样,基于Haskell 2010语言报告(https://www.haskell.org/onlinereport)第1部分第2.7节("词汇结构":'布局')中包含的以下句子./haskell2010/haskellpa1.html):
"如果紧跟在where,let,do或of之后的非括号lexeme的缩进小于或等于当前缩进级别,则插入空列表"{}"而不是开始布局,并且布局对当前级别进行处理(即插入分号或近括号)."
有关布局规则的更详细说明,请参见Haskell 2010语言报告第1部分(上面给出的URL)的第10.3节("语法参考":'布局').
在阅读这个更详细的说明时,我感到放心,我对Layout(即C')生成的布局不敏感代码的预测是正确的.
然而,令我惊讶的是,当我在GHCi中尝试上面规定的原始代码(即C*)时,它起作用(正确解析并按预期运行).
问题......
上面引用的句子(来自第2.7节)是否准确?
上面提到的布局规则(来自第10.3节)的详细说明是否准确?
我使用的推理中的缺陷是什么来达到我对由原始代码C*的Layout生成的布局不敏感代码(即C')的预测?
布局为上面规定的原始代码(即C*)生成的布局不敏感代码是什么,以及解释它的规则/原则是什么?
一般来说,有没有办法可以查看Layout生成的布局不敏感代码?如果是这样,它是什么(请详细说明/解释适合Haskell新手的技术,像我一样)?
我看到Hackage 2有一个changelog字段.这是我长期以来想要的功能.但是,多次谷歌搜索未能找到关于如何填充此字段的单一文档.有谁知道怎么做?
我想创建一个Haskell函数,可以从给定列表中选择一个随机数.我的签名是:
randomPick :: [a] -> a
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
只是阅读"斯科特迈耶斯"的一篇古老但有趣的文章
http://aristeia.com/Papers/C++ReportColumns/novdec95.pdf
基本上它是关于宁愿使用'\n'过std::endl(我同意,并使用相同的扩充年).
但是最后一部分表明这不包含在他的书中,因为整个事情由于两点而变得没有实际意义:
std::cout 没有缓冲.ios::unitbuf未明确定义on std :: cout 的状态(因此依赖于实现).我做了一个快速查看,但找不到明确的标准参考1是真的.是否std::cout与我一直以来的理解相反?
具体来说,这是一个讨论:
内存消耗明智,是否有可能使用
struct两个ints占用更多内存而不仅仅是两个ints?
或者,用语言来说:
#include <iostream>
struct S { int a, b; };
int main() {
std::cout << (sizeof(S) > sizeof(int) * 2 ? "bigger" : "the same") << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何合理的1(不一定是普通或当前)环境,这个小程序会打印出来bigger?
1为了澄清,我在这里所指的是以一些有意义的数量开发和生产的系统(和编译器),特别是不是为了证明这一点而构建的理论示例,或一次性原型或业余爱好者创作.
我在ARM cortex-A8上使用ELinux内核.
我知道引导加载程序的工作原理以及它正在做什么工作.但我有一个问题 - 为什么我们需要bootloader,为什么bootloader诞生了?
为什么我们不能在没有bootloader的情况下直接从闪存中将内核加载到RAM中?如果我们加载它会发生什么?事实上,处理器不会支持它,但为什么我们遵循这个程序呢?
在以下程序中
#include <iostream>
#include <sstream>
int main()
{
std::istringstream iss("-89");
std::cout << static_cast<bool>(iss) << iss.good() << iss.fail() << iss.bad() << iss.eof() << '\n';
unsigned int u;
iss >> u;
std::cout << static_cast<bool>(iss) << iss.good() << iss.fail() << iss.bad() << iss.eof() << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
流lib将一个有符号的值读入一个unsigned int甚至没有打嗝的情况下,默默地产生错误的结果:
11000
10001
Run Code Online (Sandbox Code Playgroud)
我们需要能够捕获那些运行时类型不匹配错误.如果我们还没有在模拟中发现这一点,这可能会炸毁非常昂贵的硬件.
我们如何安全地从流中读取无符号值?
我开始在主分支中执行一个简单的任务.你知道任务的类型"这太简单了,甚至打扰了git分支"......不可避免的结果是,现在我在主分支中有很多未完成的工作,需要处理其他事情.如何将当前工作移至新分支?
非常不言自明.我知道makeClassy应该创建类型类,但我发现两者之间没有区别.
PS.用于解释两者默认行为的加分点.