C++ 如何将0接受为整数而不是布尔值?

C++ 如何将0接受为整数而不是布尔值?,c++,C++,我正在尝试只验证用户输入的整数。我的代码工作正常,除非用户输入0。它不认为它是整数,它认为数值是错误的。下面是我如何编写这个项目的一个简短示例 int main () { int num; cout << "Please enter an integer: "; cin >> num; cout << endl; while (! num) { cout << "That

我正在尝试只验证用户输入的整数。我的代码工作正常,除非用户输入0。它不认为它是整数,它认为数值是错误的。下面是我如何编写这个项目的一个简短示例

int main ()
{
    int num;
    cout  << "Please enter an integer: ";
    cin >> num;
    cout << endl;

     while (! num)
     {
          cout << "That is not an integer.\n";
          return;
     }
}
int main()
{
int-num;
cout>num;
cout表达式
!num
true
如果且仅当
num
为0。因此,您的实现存在缺陷

最简单的方法是使用

if (!(std::cin >> num)){
    std::cout << "That is not an integer.\n";
}
if(!(std::cin>>num)){
std::cout表达式
!num
true
如果且仅当
num
为0。因此,您的实现存在缺陷

最简单的方法是使用

if (!(std::cin >> num)){
    std::cout << "That is not an integer.\n";
}
if(!(std::cin>>num)){

STD::C++中的CUT< P>内置的代码> INT/CUT>类型不具有任何可选的有效性,就像它在其他语言中所做的那样:“<代码>!Num < /代码>”只是“<代码> num=0</代码>”,而不是“<代码> Num < /C> >不存在。

然而,C++17有
std::可选的
模板,它可以将普通的
int
转换为您最初期望的格式

您所需要的只是一些简单的模板魔术,使其与
istream
一起工作:

template< class CharT, class Traits, class T >
basic_istream<CharT,Traits>& operator>>( basic_istream<CharT,Traits>&& st,  
                                         std::optional<T>& value )
{
    T res;
    st>>res;
    value = (st)?res:{};
    return st;
}
模板
basic_istream&operator>>(basic_istream&st,
std::可选值(可选值和值)
{
T res;
st>>res;
值=(st)?res:{};
返回st;
}
想一想,STL应该提供盒子中的重载

现在,您只需将
int num
替换为
std::optional num
,瞧,您的代码按预期工作


>认真地,只使用BaseHBA的解决方案。在C++中,内置的<代码> int >代码>类型对它没有任何可选的有效性,就像它在其他语言中所做的那样:“<代码>!Num < /代码>”只是“<代码> Num=0</代码>”,而不是“<代码> Num < /C> >不存在。

然而,C++17有
std::可选的
模板,它可以将普通的
int
转换为您最初期望的格式

您所需要的只是一些简单的模板魔术,使其与
istream
一起工作:

template< class CharT, class Traits, class T >
basic_istream<CharT,Traits>& operator>>( basic_istream<CharT,Traits>&& st,  
                                         std::optional<T>& value )
{
    T res;
    st>>res;
    value = (st)?res:{};
    return st;
}
模板
basic_istream&operator>>(basic_istream&st,
std::可选值(可选值和值)
{
T res;
st>>res;
值=(st)?res:{};
返回st;
}
想一想,STL应该提供盒子中的重载

现在,您只需将
int num
替换为
std::optional num
,瞧,您的代码按预期工作


说真的,只要用芭丝谢芭的解决方案。

while(!num)
意味着如果
num
0
您的检查逻辑被破坏,则进入循环。
num
始终是一个整数。您应该检查
cin>>num
的返回值。您只获得整数,您只使用
num
进行条件检查,并且它的行为与预期的一样。如果您解释了用例,那么我将t可能更有帮助。
num
始终是一个int。如果有人输入字符串,
cin>>num;
将抛出。
while(!num)
意味着如果
num
0
您的检查逻辑被破坏,则进入循环。
num
始终是一个整数。您应该检查
cin>>num
的返回值。您只获得整数,您只使用
num
进行条件检查,并且它的行为与预期的一样。如果您解释了用例,那么我将t可能更有帮助。
num
始终是一个int。如果有人输入字符串,
cin>>num;
将抛出。谢谢!我在编写此代码时一定很累,因为我以前肯定用这种方式验证过输入。谢谢!我在编写此代码时一定很累,因为我肯定验证过输入t他过去的方式。谢谢!