为啥 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)。您还可以使用 keyboardfile 输入流。

#include <stdio.h>
int main ()

  char c = ' ';
  while(c != ';') 
    c = getc(stdin);
    printf("%c", c);
    
  return 0;

【讨论】:

以上是关于为啥 c++ 中的分号似乎隐式处理错误? [tldr:他们没有]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 为啥基类/结构构造函数不能有多个参数可以从派生中隐式调用?

我不明白为啥会出现语法错误

C++:隐式常量转换中的溢出 [-Woverflow]

c++ 宏编写技巧

c++ 宏编写技巧

c++ 宏编写技巧