为啥 c++ 中的分号似乎隐式处理错误? [tldr:他们没有]
Posted
技术标签:
【中文标题】为啥 c++ 中的分号似乎隐式处理错误? [tldr:他们没有]【英文标题】:Why do semi-colons in c++ seem to implicitly handle errors? [tldr: they don't]为什么 c++ 中的分号似乎隐式处理错误? [tldr:他们没有] 【发布时间】:2019-10-29 11:35:57 【问题描述】:这是在 windows 上 c++ 的 Visual Studio 2019 社区版分发中。我有以下代码:
char c;
c = getc(stdin); // reading in some value
while(c != ';');
// do something
当分号位于 while 循环的末尾时,它会阻止抛出异常。似乎是在循环中触发的,其中“做某事”是。当我将其更改为:
char c;
c = getc(stdin); // reading in some value
while(c != ';')
// do something -> exception thrown
谁能给我解释一下? 编辑:只是为了更具体。在循环的“//做某事”部分中,我正在更改 c 的值等等,我认为它不相关,所以我没有包含它。
【问题讨论】:
请注意,getc
返回一个 int
,如果您想要检查 EOF
(您总是 应该这样做)。
如果你得到一个异常,那么你可能在你没有显示的“做某事”代码中有一些错误。也许问一个关于它的新问题?
我相信编译器删除了表达式while(c != ';');
,因为它什么都不做。
最后,为什么在 C++ 代码中使用 C getc
函数?为什么不使用标准 C++ std::cin
流?无助于解决您的问题或崩溃,但它会“更好”。 :)
回答我为什么使用 getc 的问题。我在 C++ 实现方面遇到了问题,并且对 c 充满信心,我更改了所有内容,因此设置了我在 c 中的操作方式,然后在我修复 c++ 时慢慢更改它。
【参考方案1】:
代码
while(c != ';');
// Do something
等价于
while(c != ';')
// Empty body
// Do something
所以你首先有一个(可能)无限循环,然后“做某事”代码在它自己的嵌套范围内。
【讨论】:
【参考方案2】:第一个 sn-p 中的// do something
部分不是while
循环的一部分,cf.第二个 sn-p 它所在的位置。
这是一个足以改变程序行为的控制流更改。
【讨论】:
【参考方案3】:此声明
while(c != ';');
如果c
不等于';'
,则可以调用无限循环。循环体是空语句;
。所以c
没有改变。
在此声明中
while(c != ';')
// do something -> exception thrown
循环体由复合语句组成
// do something -> exception thrown
例如c
可以在其中更改或存在中断语句。
【讨论】:
【参考方案4】:getc 函数需要一个输入流,例如:getc(input_stream)。您还可以使用 keyboard 或 file 输入流。
#include <stdio.h>
int main ()
char c = ' ';
while(c != ';')
c = getc(stdin);
printf("%c", c);
return 0;
【讨论】:
以上是关于为啥 c++ 中的分号似乎隐式处理错误? [tldr:他们没有]的主要内容,如果未能解决你的问题,请参考以下文章