好的,对于C ++编程语言的语法仍然是新的,并且遇到了一些在示例中显示的内容,但没有在某个层面上解释事物,以便有人完全理解它是什么。
例如,如果你要创建一个变量say:int x = 0;零件做什么,将其设置为零或保持假值?以下代码中的细节。 还有一些解释:if(!(cin>> input))input = 0 if(!(cin>> 0))?如果它不为零?看起来像零保持一些其他值。
另外cin.clear()和cin.ignore确定我已经听说它清除了下一行或删除了一些东西但是真的彻底解释了这个会发生什么真的有帮助吗? 如果这个简单的零件有漏洞,那么就无法真正转向更大的东西。 另外两件事是endl函数和cin.get()这些做了什么呢?
int main()
{
int input = 0;
do
{
cout<<"Enter a number (-1 = QUIT):";
if (!(cin>> input))
{
cout<<"INVALID" <<endl;
cin.clear();
cin.ignore(10000, '\n');
}
if (input != -1)
{
cout<<input<<" was entered"<<endl;
}
}
while (input != -1);
cout<<"Done"<<endl;
cin.get();
return 0;
}
答案 0 :(得分:1)
下面的代码是我写这个问题时提供的代码,除了我在顶部添加了必需的标题和using
指令:
#include <iostream>
using namespace std;
int main()
{
int input = 0;
do
{
cout<<"Enter a number (-1 = QUIT):";
if (!(cin>> input))
{
cout<<"INVALID" <<endl;
cin.clear();
cin.ignore(10000, '\n');
}
if (input != -1)
{
cout<<input<<" was entered"<<endl;
}
}
while (input != -1);
cout<<"Done"<<endl;
cin.get();
return 0;
}
#include <iostream>
是预处理程序指令。源代码预处理器在编译器正确之前运行,并执行文本替换,文本包含和文本选择。 #include
指示它包含名为iostream
的标题中的所有文字。与双引号字符相对的尖括号表示它不应该在包含文件的目录中搜索。实际上,它没有指明它应该做什么额外的搜索,但在实践中,对于当前的编译器,它是如上所述。
iostream
标头提供标准库中i / o内容的声明,例如std::cout
。
using namespace std;
使std
命名空间中的标识符可直接在全局命名空间中使用。例如,您可以写cout
而不是限定std::cout
或完全限定::std::cout
。
using namespace
指令适用于小型探索性和个人工具程序,但在更大的代码库中可能更麻烦。
无论如何,请记住从不将此指令放在标题中的全局命名空间中,因为这是在包含该标头的代码中创建名称冲突的可靠方法。例如,标准库定义了名称std::distance
。如果没有限定条件,使用using namespace std;
指令,名称distance
非常可能会在使用代码时与名称distance
发生冲突。
int main()
是main
的最小声明。 main
函数是C中用户提供的启动函数,在C ++中它的作用大致相同,只是在C ++中静态变量的动态初始化可以在main
执行之前发生。
上面的声明是C ++ 03方式。在C ++ 11中,它也可以声明为
auto main() -> int
这意味着完全相同,并且更冗长,但通常可以合理地指出使用此语法的约定。即为了一致性。
main
函数也可以有参数,然后表示提供给进程的命令行参数,但此方案仅适用于基于UTF-8的* nix-es。对于基于main
的{{1}}参数,以及Windows中基于默认char
的文本编码,例如不能表示具有国际字符的文件名。因此,对于可移植代码使用char
参数通常不是一个好主意。
main
声明一个名为 int input = 0;
的变量input
,并将其初始化为int
。
当用作布尔值时,基本类型的任何零值都代表0
。相反,任何非零值都代表false
,这个约定源于早期的C,它没有true
类型。在现代C ++中,最好使用bool
类型的布尔值,使用值(字面意思)bool
和false
。
但是,上面的变量不会用作布尔值,而是表示用户输入的最后一个数字。
true
这是一个 do
{
// Stuff, called the "loop body".
}
while (input != -1);
循环。在每次迭代后检查{em> 后继续条件。这意味着循环体保证至少执行一次。
C ++还有另外三个循环:do-while
循环;普通的while
- 循环,它收集循环头中的所有循环控件内容;和基于范围的while
,这对于迭代集合中的项目特别有用。
for
上面的第一个声明只是提示用户。 for
和 cout<<"Enter a number (-1 = QUIT):";
if (!(cin>> input))
{
cout<<"INVALID" <<endl;
cin.clear();
cin.ignore(10000, '\n');
}
流是同步,因此当尝试后续输入操作时,如果屏幕上尚未显示输出,则已刷新< / strong>即可。而不是这种自动的,隐式刷新,您可以通过明确地执行它来保证刷新,如下所示:
cout
表达式cin
试图解释下一个&#34;字&#34;用户输入作为整数,并将其存储在变量 cout<<"Enter a number (-1 = QUIT):" << flush;
和
生成对cin >> input
的引用作为其表达式结果。
如果文字输入失败,或者从文字规范到input
的转换失败,则cin
会进入失败状态。在这种状态下,进一步的输入被忽略。令人高兴的是,检查起来很容易,因为当流直接用作int
或cin
(包括if
)条件时,它会隐式转换为boolean 好像你写了while
。
因此,do-while
执行上述所有操作,并生成!stream.fail()
的结果(两次否定,“不是”),其中!(cin >> input)
是一个成员函数,用于检查是否流处于故障状态。
如果流处于故障状态,则必须清除该状态,以免进一步忽略输入操作,这是什么
!!cin.fail()
实现。
此外还会有一些输入文本 - 至少是换行符(行尾标记) - 留在输入缓冲区中,并避免下次将该文本作为有效输入处理在循环周围,最好将其删除!
是什么fail
来实现的。假设输入缓冲区中剩余不超过10000个字符......
cin.clear();
输出文本“INVALID”,后跟换行符。输出 cin.ignore(10000, '\n');
操纵器会产生换行符加上刷新的效果。因此,上述内容相当于
cout<<"INVALID" <<endl;
新手常常关注的是endl
与 cout<<"INVALID\n" << flush;
相比缺乏效率。endl
。然而,这种担忧是错误的。 Iostreams是为了方便和(由于强大的类型检查)避免C风格的i / o容易的错误;他们通常不会选择效率。
循环后,
\n
停止程序,直到用户输入一些输入。
这是因为当程序从IDE(而不是从命令行)运行时,控制台窗口可能会消失。特别是对于那些不受欢迎的非交互式节目。因此,上述声明虽然不是这个特定程序所必需的,但却是一般惯例。
然而,它是不好的。从命令行运行程序时会变得很烦人!相反,要查看程序的所有输出,请执行
从命令行运行它,或
以自动停止的方式运行它(例如Visual Studio中的Ctrl + F5)或
在 cout<<"Done"<<endl;
cin.get();
的最后}
右大括号上放置一个断点,并在调试器中运行它。
main
是不必要的,因为这是 return 0;
的默认函数结果(main
在具有默认函数结果时是唯一的。)
main
返回的值实际上将成为流程退出代码。
在Windows和* nix中,惯例是0表示成功,任何其他值表示失败。
在C ++中,唯一的可移植值为0,main
和EXIT_FAILURE
,其中后两者来自EXIT_SUCCESS
标头。 stdlib.h
和EXIT_FAILURE
取决于手头的系统,但后者通常只有0.在Windows中,您可能希望使用Windows&#39;拥有EXIT_SUCCESS
而不是E_FAIL
,因为(出于不可思议的原因)Windows C ++编译器通常将EXIT_FAILURE
定义为1,这也是一个特定的Windows错误代码 - 而在Windows中,进程退出代码是通常字面上表示该术语表示的内容,即标准错误代码,0为“无错误”。