在C++入门中我找到了这段代码:
if (cin.fail())
{ // bad input
cerr<< "bad data, try again"; // warn the user
cin.clear(istream::failbit); // reset the stream
continue; // get next input
}
Run Code Online (Sandbox Code Playgroud)
我很困惑,为什么istream::failbit用于设置错误状态标志,我的意思是,因为错误已经发生(因此流程现在在if块然后必须设置failbit,他们为什么用它来设置错误标志那又一次.我在理解这个问题上哪里错了?
编辑:该书说"我们打印一个警告并清除failbit状态",但IMO clear(istream :: failbit)正在使用failbit中包含的值设置流的当前状态.那么为什么本书将流的状态设置为failbit,因为它将阻止cin运行,因为它将处于错误状态.++++通过流的状态,实际上谈论的是什么,是eofbit,badbit,goodbit,failbit还是它们的组合?我怎么知道这些单独位的价值呢?
所以,我可以预测这个程序会做什么:
int main()
{
char d[] = {'h','e','l','l','o'};
const char *c = d;
std::cout << *c << std::endl;
while ( *c ) {
c = c + 1;
std::cout << *c << std::endl;
if ( *c == '\0' )
std::cout << "Yes" << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从我的理解,代码应该永远不会打印是因为\0字符数组中没有d[],所以这个程序正在采摘的垃圾值是什么?我做了这个,同时应该无限次地运行.是对的吗?
在这段代码中:
const int & fun(const int &i)
{
return 2*i;
}
int main()
{
const int k=3;
cout<<fun(k)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,参数fun不是本地的(没有临时对象存储引用返回类型)那么为什么会出现此警告?
+如果我删除常量从返回类型函数fun,它说
错误:从'int'类型的右值开始,无效初始化'int&'类型的非const引用
但是在删除2*(只剩下我返回的值时)它没有显示任何错误 - >我能想到的是这个2*的东西是将返回转换为Rvalue但是后来不是Rvalue本身的返回值?我哪里错了?
当我在任何声明中评论时:
std::cout/*inside cout statement*/<<"Howdy"<<endl; //Code 1
Run Code Online (Sandbox Code Playgroud)
要么
std::cout/*inside cout
statement*/<<"Howdy"<<endl; //Code 2
Run Code Online (Sandbox Code Playgroud)
它工作得很好(尤其是代码2的工作令人惊讶,其中整个事情被分成两行 - 当一些令牌在内部被破坏时,唯一的问题就出现了:
c/*the hell*/out<<"Howdy"<<endl; //cout is broken
Run Code Online (Sandbox Code Playgroud)
编译器究竟如何处理这个?
为什么在此代码中指针转移到另一个位置:
#include <stdio.h>
void f(int *p)
{
int j=2;
p=&j;
printf("%d\n%p\n%d\n",*p,&j,p);
}
int main(void)
{
int *q;
int m=98;
q=&m;
f(q);
printf("%p ",q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
2
0x7ffff5bf1bcc
0x7ffff5bf1bcc
0x7ffff5bf1bc8
我明白,当函数f()与打印值完成j和地址 j的内存占用j追溯到堆栈,但IMO p应继续指向该位置甚至在功能上与应该打印相同的地址主同样.这有什么问题?