【问题标题】:C++ incrementing global counter variables in if-else statementsC++ 在 if-else 语句中递增全局计数器变量
【发布时间】:2021-11-04 15:51:09
【问题描述】:

所以我的总体目标是制作一个程序来显示与用户输入的波长数相关的颜色(400 到 445 是紫色等)。输入需要在 400 到 700 之间,并让用户知道输入是高还是低。我还需要实现一个全局计数器变量,它将计数并显示在用户输入和颜色范围之间执行的比较量(对于它通过的每个 else 语句,递增 1)。这是我到目前为止所拥有的。 代码:

#include <iostream>
using namespace std;
int g_counter;

int main()
{
g_counter = 0;
int userinput;

cout<< "please enter wavelength between 400 and 700: "<< endl;
cin>>userinput;
++g_counter;
if (userinput < 400){
    cout << "Wavelength to small, try again"<< endl;
    
    cout << "You evauluated this many conditions: "<< g_counter << endl; 
}
++g_counter;
else (userinput >= 400 && userinput <=445){
    cout<<  "Your wavelength corresponds to the color violet"<< endl;

    cout << "You evauluated this many conditions: "<< g_counter << endl; 
}
++g_counter;
else (userinput > 445 && userinput <= 475){
    cout<< "Your wavelength corresponds to the color blue"<< endl;
    
    cout << "You evauluated this many conditions: "<< g_counter << endl; 
}
++g_counter;
else (userinput > 475 && userinput <= 510){
    cout<< "Your wavelength corresponds to the color green"<< endl;
    
    cout << "You evauluated this many conditions: "<< g_counter << endl; 
}
++g_counter;
else (userinput > 510 && userinput <= 570){
    cout<< "Your wavelength corresponds to the color Yellow"<< endl;

    cout << "You evauluated this many conditions: "<< g_counter << endl; 
}
++g_counter;
else (userinput > 570 && userinput <= 590){
    cout<< "Your wavelength corresponds to the color Orange"<< endl;
    
    cout << "You evauluated this many conditions: "<< g_counter << endl; 
}
++g_counter;
else ( userinput > 590 && userinput <= 700){
    cout<< "Your wavelength corresponds to the color red"<< endl;
    
    cout << "You evauluated this many conditions: "<< g_counter << endl; 
}
++g_counter;
else ( userinput > 700 ){
    cout<< "wavelength to large, try again"<< endl;

    cout << "You evauluated this many conditions: "<< g_counter << endl; 
}

return 0;
}

我的问题是我无法理解编译时遇到的错误。 错误:

Homework2.cpp: In function ‘int main()’:
Homework2.cpp:19:1: error: ‘else’ without a previous ‘if’
 else (num >= 400 && num <=445){
 ^
Homework2.cpp:19:31: error: expected ‘;’ before ‘{’ token
 else (num >= 400 && num <=445){
                               ^
Homework2.cpp:26:1: error: ‘else’ without a previous ‘if’
 else (num > 445 && num <= 475){
 ^
Homework2.cpp:26:31: error: expected ‘;’ before ‘{’ token
 else (num > 445 && num <= 475){
                               ^
Homework2.cpp:32:1: error: ‘else’ without a previous ‘if’
 else (num > 475 && num <= 510){
 ^
Homework2.cpp:32:31: error: expected ‘;’ before ‘{’ token
 else (num > 475 && num <= 510){
                               ^
Homework2.cpp:38:1: error: ‘else’ without a previous ‘if’
 else (num > 510 && num <= 570){
 ^
Homework2.cpp:38:31: error: expected ‘;’ before ‘{’ token
 else (num > 510 && num <= 570){
                               ^
Homework2.cpp:44:1: error: ‘else’ without a previous ‘if’
 else (num > 570 && num <= 590){
 ^
Homework2.cpp:44:31: error: expected ‘;’ before ‘{’ token
 else (num > 570 && num <= 590){
                               ^
Homework2.cpp:50:1: error: ‘else’ without a previous ‘if’
 else ( num > 590 && num <= 700){
 ^
Homework2.cpp:50:32: error: expected ‘;’ before ‘{’ token
 else ( num > 590 && num <= 700){
                                ^
Homework2.cpp:56:1: error: ‘else’ without a previous ‘if’
 else ( num > 700 ){
 ^
Homework2.cpp:56:19: error: expected ‘;’ before ‘{’ token
 else ( num > 700 ){
                   ^

例如,错误“Homework2.cpp:19:1: error: ‘else’ without a previous ‘if’”对我来说没有意义,因为之前存在 if。此外,即使它实际上检查了更多比较,全局计数器(当程序在我搞砸之前工作时)仍然给出 1 的答案。任何关于这些问题的指示都会很棒。

【问题讨论】:

  • 您是否希望所有 8 行 ++g_counter; 每次都执行?
  • yes Drew,如果输入大于 else 语句的范围,计数器应该增加 1 以表示比较完成。
  • 您似乎对if statements 的语法感到困惑。 else 是 if 语句的一部分,而不是单独的构造。 ifelse之间只能有一个语句,通常是由{}包围的复合语句。
  • 由于每个else 条件都会检查与前一个条件相反的条件,看起来您可以将所有else 替换为if 并且应该没问题。
  • 感谢@FrançoisAndrieux 修复了它。

标签: c++ if-statement nested counter global


【解决方案1】:

您的问题是 if/else 构造应该如下所示:

if (...) 
{ ... /* then case code */ }
else 
{ ... /* else case code */ }

“then case 代码”末尾的“}”和开始 else 分支的“else”之间没有任何内容。

在上述情况下,这两个组件之间有一个“g_counter++”,它不会形成有效的 if/else 构造。

【讨论】:

  • 好的,我得到的指示是“在程序开始时定义一个 global2 计数器变量。在每个检查的条件之前立即增加这个变量。”如果那个位置不正确,我应该在哪里增加 g_counter?
  • @ChunkierLizard 查看 Francois Andrieux 在您的问题下的评论。
【解决方案2】:

else 命令必须立即if(){} 块开头。在 betwwen 中设置 g_counter 会使 next else 出错。

要计算比较,您可以使用comma operator,它返回(E1,E2)E2 的评估结果

所以你可以这样编码:

if (++g_counter, userinput < 400){
    cout << "Wavelength to small, try again"<< endl;
    
    cout << "You evauluated this many conditions: "<< g_counter << endl; 
}

else if ((++g_counter, userinput >= 400) && (++g_counter, userinput <=445)){
    cout<<  "Your wavelength corresponds to the color violet"<< endl;

    cout << "You evauluated this many conditions: "<< g_counter << endl; 
}

else....

注意使用&amp;&amp;时的括号(两个比较)

【讨论】:

  • 我认为这与预期的行为不同,因为g_counter 会被某些else ifs 增加两次。
  • 也许值得一提的是,“else”必须立即在“if”之前。我认为存在混淆,因为对于“之后”的某些定义,所有 else 语句 确实 发生在 if 语句之后。
  • @FrançoisAndrieux 这取决于 OP 是否将“比较”定义为 if 块内的条件或 &lt;&gt; 等运算符执行的数量。
  • @Ripi2 在我看来,OP 想在每个分支之间只增加一次 g_counter,无论是否采用。
  • 您可以删除 (++g_counter, userinput &gt;= 400) &amp;&amp; 部分,因为如果您进入 else {} 将消除对 g_counter 的额外比较和额外增量,您就知道它是真的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多