C ++中的这个程序非常简单:
while (ch = cin.get())
cout << ch;
如果我放了一个角色,然后按回车,我会在屏幕上看到这个标志。例如:
w
w
k
k
我可以将代码更改为以下格式:
ch = cin.get();
while (ch != 'q')
{
cout << ch;
ch = cin.get();
}
在这种情况下,如果我输入q字母,程序将停止。我试着缩短上一个程序的版本:
while (ch = cin.get() && ch != 'q')
cout << ch;
不幸的是,这个程序不会打印任何字符。如果我输入字母并按Enter键,光标将在屏幕上显示新行(不打印),程序将等待新字符。我不明白为什么在这个程序中,方法“cin.get()”不会将任何字符分配给“ch”变量。当然ch的类型是char。
答案 0 :(得分:2)
如果您查看C++'s operator precedence,您会发现&&
的绑定比=
更强,这基本上意味着您的代码会被评估为...... {/ p>
while (ch = (cin.get() && ch != 'q'))
...不...
while ((ch = cin.get()) && ch != 'q')
您应该在上面的最后一行添加(
和)
。
实际发生的事情是ch = cin.get() && ch != 'q'
测试它可以获得一个角色(可能是true
),并且角色不是q
(true
如果角色当你读取它似乎未初始化时,并不会恰好在第一个q
循环迭代中有while
- 这将是未定义的行为 - 尽管你可能在定义时给它一个初始值)。 true && true
为true
,因此相当于ch = true
。 true
转换为char
,其值为1
...您的终端可能会打印出某些内容......它不是正常的“可打印”(可见)ASCII代码之一。在下一个循环迭代中,我们知道ch
是1
所以它永远不能等于q
...现在终止的唯一方法是cin.get()
因为“文件结束”条件 - 在UNIX / Linux上按下control-D或在Windows上按control-Z,或者像control-C或kill / end任务那样将整个程序从循环中断开。