在while循环中使用逻辑运算符cin.get

时间:2014-04-18 12:30:15

标签: c++ while-loop

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。

1 个答案:

答案 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),并且角色不是qtrue如果角色当你读取它似乎未初始化时,并不会恰好在第一个q循环迭代中有while - 这将是未定义的行为 - 尽管你可能在定义时给它一个初始值)。 true && truetrue,因此相当于ch = truetrue转换为char,其值为1 ...您的终端可能会打印出某些内容......它不是正常的“可打印”(可见)ASCII代码之一。在下一个循环迭代中,我们知道ch1所以它永远不能等于q ...现在终止的唯一方法是cin.get()因为“文件结束”条件 - 在UNIX / Linux上按下control-D或在Windows上按control-Z,或者像control-C或kill / end任务那样将整个程序从循环中断开。