(C ++)Goto语句不起作用。初学者

时间:2014-06-13 05:53:27

标签: c++ if-statement converter goto

我正在制作一个美元到MXN转换器,我想让它在两个方面都有效。 if语句有效(尝试了cout<<“test”;并且它有效)但是当我用goto语句替换它时它不会工作。

    #include "stdafx.h"
    #include <cstdlib>
    #include <iostream>

    using namespace std;

    int main(int argc, char *argv[])
    {
int user;
int u, m;
cout << "US/MXN Converter" << endl;
cout << "1 US = 12.99 MXN (6/12/2014)" << endl;
cout << endl;

cout << "What Way to convert" << endl;
cout << "[1] US to MXN" << endl;
cout << "[2] MXN to US" << endl;
cout << "Selection: ";
cin >> user;

if (user == 1)
{
    goto USTMXN;
}
else
{
    goto MXNTUS;
}

    USTMXN:
cout << "Enter the amount of US Dollars to Convert" << endl;
cout << "Amount: ";
cin >> u;
m = u * 12.99;
cout << endl;
cout << "MXN Pesos: " << m << endl;
goto END;

    MXNTUS:
int mm, uu;
cout << "Enter the amount of Pesos to Convert" << endl;
cout << "Amount: ";
cin >> mm;
uu = mm / 12.99;
cout << endl;
cout << "US Dollars: " << m << endl;
goto END;

    END:

system("PAUSE");
return EXIT_SUCCESS;
    }

2 个答案:

答案 0 :(得分:6)

作为程序员,我们必须做的最基本的事情之一就是学会将问题分解为更小的问题。你实际上遇到了一系列问题。

我将向您展示如何解决您的问题。你可能想要预定这个答案,因为我预先解决了一些问题,你将会遇到一些问题并准备好你 - 如果你注意 - 你自己解决它们;)

让我们首先删除您的代码。

现场演示:http://ideone.com/aUCtmM

#include <iostream>

int main()
{
    std::cout << "Enter a number: ";
    int i;
    std::cin >> i;

    std::cout << "Enter a second number: ";
    int j;
    std::cin >> j;

    std::cout << "i = '" << i << "', j = '" << j << "'\n";
}

我们在这里查看什么?我们正在检查我们是否可以向用户提出两个问题。这很好。

接下来是你对goto的使用,我强烈建议你不要使用它。最好使用一个函数。我将首先在这里演示你的goto案例:

#include <iostream>

int main()
{
    int choice;
    std::cout << "Enter choice 1 or 2: ";
    std::cin >> choice;
    if ( choice == 1 )
        goto CHOSE1;
    else if ( choice == 2 )
        goto CHOSE2;
    else {
        std::cout << "It was a simple enough question!\n";
        goto END;
    }

CHOSE1:
    std::cout << "Chose 1\n";
    goto END;

CHOSE2:
    std::cout << "Chose 2\n";
    goto END;

END:
    std::cout << "Here we are at end\n";
}

现场演示:http://ideone.com/1ElcV8

因此,问题还没有解决。

这使您可以使用变量。通过使用第二组变量(mm,uu),你真的把事情搞得一团糟。你不仅不需要这些,你做了一些非常顽皮的事情,因为这些变量只存在于一个范围内,而不存在于另一个范围内。你可以逃脱&#34;逃避&#34;有了它,但它会在以后再次困扰你。

两个主要代码流的区别在于变量名称。第二个转换案例如下:

    MXNTUS:
int mm, uu;
cout << "Enter the amount of Pesos to Convert" << endl;
cout << "Amount: ";
cin >> mm;
uu = mm / 12.99;
cout << endl;
cout << "US Dollars: " << m << endl;
goto END;

这里的问题是你 - 意外地 - 使用了变量&#34; m&#34;在你的输出中。这就是我们所谓的未初始化。

cout << "US Dollars: " << m << endl;

中间的m应为mm

您的编译器实际上应该警告您。如果不是,并且您只是开始学习,那么您应该弄清楚如何提高编译器警告级别。

最好做一个功能来进行转换;你可以为每个方向制作一个函数,但是我已经创建了一个处理这两种情况的函数:

#include <iostream>

static const double US_TO_MXN = 12.99;
static const char DATA_DATE[] = "6/12/2014";

void convert(const char* from, const char* to, double exchange)
{
    std::cout << "Enter the number of " << from << " to convert to " << to << ".\n"
                 "Amount: ";
    int original;
    std::cin >> original;
    std::cout << to << ": " << (original * exchange) << '\n';
}

int main()  // this is valid since C++2003
{
    std::cout << "US/MXN Converter\n"
                 "1 US = " << US_TO_MXN << " MXN (" << DATA_DATE << ")\n"
                 "\n";

    int choice = 0;
    // Here's a better demonstration of goto
GET_CHOICE:
    std::cout << "Which conversion do you want to perform?\n"
                "[1] US to MXN\n"
                "[2] MXN to US\n"
                "Selection: ";
    std::cin >> choice;

    if (choice == 1)
        convert("US Dollars", "Pesos", US_TO_MXN);
    else if (choice == 2)
        convert("Pesos", "US Dollars", 1 / US_TO_MXN);
    else {
        std::cerr << "Invalid choice. Please try again.\n";
        goto GET_CHOICE;
    }

    // this also serves to demonstrate that goto is bad because
    // it's not obvious from the above that you have a loop.
}

ideone现场演示:http://ideone.com/qwpRtQ

有了这个,我们可以继续清理一大堆并扩展它:

#include <iostream>
using std::cin;
using std::cout;

static const double USD_TO_MXN = 12.99;
static const double GBP_TO_MXN = 22.03;
static const char DATA_DATE[] = "6/12/2014";

void convert(const char* from, const char* to, double exchange)
{
    cout << "Enter the number of " << from << " to convert to " << to << ".\n"
                 "Amount: ";
    int original;
    cin >> original;
    cout << '\n' << original << ' ' << from << " gives " << int(original * exchange) << ' ' << to << ".\n";
}

int main()  // this is valid since C++2003
{
    cout << "Foreign Currency Converter\n"
            "1 USD = " << USD_TO_MXN << " MXN (" << DATA_DATE << ")\n"
            "1 GBP = " << GBP_TO_MXN << " MXN (" << DATA_DATE << ")\n"
            "\n";

    for ( ; ; ) {   // continuous loop
        cout << "Which conversion do you want to perform?\n"
                "[1] USD to MXN\n"
                "[2] MXN to USD\n"
                "[3] GBP to MXN\n"
                "[4] MXN to GBP\n"
                "[0] Quit\n"
                "Selection: ";
        int choice = -1;
        cin >> choice;
        cout << '\n';

        switch (choice) {
            case 0:
                return 0;       // return from main

            case 1:
                convert("US Dollars", "Pesos", USD_TO_MXN);
                break;

            case 2:
                convert("Pesos", "US Dollars", 1 / USD_TO_MXN);
                break;

            case 3:
                convert("British Pounds", "Pesos", GBP_TO_MXN);
                break;

            case 4:
                convert("Pesos", "British Pounds", 1 / GBP_TO_MXN);
                break;

            default:
                cout << "Invalid selection. Try again.\n";
        }
    }
}

http://ideone.com/iCXrpU

这方面还有很多改进空间,但我希望它可以帮助你。

----编辑----

最后提示:根据system("PAUSE"),您似乎正在使用visual studio。只需使用Debug - &gt;而不必添加到您的代码中。启动不调试或按Ctrl-F5。它会自动为您暂停:)

----编辑2 ----

有些&#34;你是怎么做到的?#34;分。

    cout << '\n' << original << ' ' << from << " gives " << int(original * exchange) << ' ' << to << ".\n";

我非常小心地没有做using namespace std;,当你开始使用更多C ++时,该指令将成为你存在的祸根。最好不要习惯它,只有当你对C ++编程更加熟悉并且更重要的是调试奇怪的编译错误时,才让自己开始使用它。

但是通过添加using std::coutusing std::cin,我节省了大量的打字工作而没有创建我必须避免的函数/变量名称的雷区。

该线路的作用是什么:

    cout << '\n' << original << ' ' << from << " gives " << int(original * exchange) << ' ' << to << ".\n";

&#39; \ n&#39;是单个字符,回车。这样做比std::endl更有效,因为std::endl必须戳戳输出系统并强制写入;它不仅仅是行尾字符,它实际上会终止该行,如果你愿意的话。

int(original * exchange)

这是一个让C程序员感到困惑的C ++特性。我实际上是在创造一个临时的&#34;结果为original * exchange的整数作为参数。

int i = 0;
int i(0);
两者都是等价的,并且一些程序员建议最好养成使用第二种机制的习惯,这样你就可以理解当你后来遇到一种叫做“最令人烦恼的解析”的事情时会发生什么。 :)

convert("Pesos", "British Pounds", 1 / GBP_TO_MXN)

1 / x&#34;反转&#34; s。

    cout << "Foreign Currency Converter\n"
            "1 USD = " << USD_TO_MXN << " MXN (" << DATA_DATE << ")\n"
            "1 GBP = " << GBP_TO_MXN << " MXN (" << DATA_DATE << ")\n"
            "\n";

这可能令人困惑。我把这个比喻混为一谈,我有点惭愧,但它读得很好。再次,采用将问题分解为更小问题的概念。

cout << "Hello " "world" << '\n';

(注意:&#34; \ n&#34;和&#39; \ n&#39;不同:&#34; \ n&#34;实际上是一个字符串,而&#39; \ n&#39; ;字面上只是回车符号)

这会打印

Hello world

当C ++看到由这样的空格(或注释)分隔的两个字符串文字时,它会连接它们,所以它实际上传递了#Hello; Hello world&#34;小丑。

所以你可以将这段代码重写为

    cout << "Foreign Currency Converter\n1 USD = ";
    cout << USD_TO_MXN;
    cout << " MXN (";
    cout << DATA_DATE;
    cout << ")\n1 GBP = ";
    cout << GBP_TO_MXN;
    cout << " MXN (";
    cout << DATA_DATE;
    cout << ")\n\n";

我们称之为<<&#34;语义糖&#34;。当你写

cout << i;

编译器正在将其转换为

cout.operator<<(i);

这个奇怪的函数调用返回cout。所以当你写

cout << i << j;

它实际上将其翻译为

(cout.operator<<(i)).operator<<(j);

括号(cout.operator<<(i))中的表达式返回cout,因此它变为

cout.operator<<(i); // get cout back to use on next line
cout.operator<<(j);

主要指纹

int main()
int main(int argc, const char* argv[])

两者都是合法的。第一个是完全可以接受的C或C ++。第二个仅在您计划捕获&#34;命令行参数&#34;。

时才有用

最后,在主要

return 0;

请注意,main被指定为返回int。 C和C ++标准为main提供了一个特殊情况,它说它是唯一的功能,它不是一个错误,不返回任何东西,在这种情况下,程序&#34;退出代码& #34;可能是任何事情。

通常最好回报一些东西。在C和C ++&#34; 0&#34;被视为&#34; false&#34;而其他任何东西(任何不为零的东西)都是&#34; true&#34;。所以C和C ++程序有一个约定返回错误代码为0(错误,没有错误)的约定,表示程序成功或退出没有问题,或者其他任何指示(例如1,2 ... 255)错误

使用&#34;返回&#34;来自main将结束该计划。

答案 1 :(得分:-1)

尝试像这样更改你的代码。建议不要使用goto标签。 switch语句的主要思想:

int option;
  cin >> option

  switch(option)
  {
   case 1: // executed if option == 1
   {
    ... code to be executed ...
    break;
   }
   case 99: //executed id option == 99
   {
   ... code to be executed
   break;
   }
   default: // if non of above value was passed to option
   {
   // ...code...
   break;
   }


  }

唯一的例子。

   int main(int argc, char *argv[])
        {
    int user;
    int u, m;
    cout << "US/MXN Converter" << endl;
    cout << "1 US = 12.99 MXN (6/12/2014)" << endl;
    cout << endl;

    cout << "What Way to convert" << endl;
    cout << "[1] US to MXN" << endl;
    cout << "[2] MXN to US" << endl;
    cout << "Selection: ";
    cin >> user;

   switch(user )
    {
     case 1 : 
     {
     //USTMXN:
     cout << "Enter the amount of US Dollars to Convert" << endl;
     cout << "Amount: ";
     cin >> u;
     m = u * 12.99;
     cout << endl;
     cout << "MXN Pesos: " << m << endl;
     break;
     }

    }
    default :
    {
    //MXNTUS:
     int mm, uu;
     cout << "Enter the amount of Pesos to Convert" << endl;
     cout << "Amount: ";
     cin >> mm;
     uu = mm / 12.99;
     cout << endl;
     cout << "US Dollars: " << m << endl;
     break;
    }
   }
    system("PAUSE");
    return EXIT_SUCCESS;
        }