C ++编程错误:“{”标记之前的预期unqualified-id

时间:2011-06-19 19:11:59

标签: c++ compiler-errors token

我是C ++的新手,我正在尝试制作一个“计算器”:添加两个数字,减去两个数字,乘以两个数字,除以两个数字,取一个数字的正弦,取余数数字,或取一个数字的正切值。这是代码:

#include <iostream>;
#include <cmath>;
#include <string>
int main () 
{}
int ask(std::string operation);
    {
        std::cout<<"Type Addition, Subtraction, Multiplication, Division, Sine, Cosine, or Tangent:\n";
        std::cin>>operation;
            if (operation="Addition") 
            {
                goto Add
                                }
    float Add(float addend1, float addend2, float answer) 
    {
    Add:
        std::cout<<"Insert the first number to be added:\n";
        std::cin>>addend1;
        std::cout << "Insert the second number to be added:\n";
        std::cin>>addend2;
        answer=addend1+addend2;
        std::cout<<addend1<<"+"<<addend2<<"="<<answer<<"\n";
        break
    }
}

稍后会有更多功能,但我的问题在第7行。有一个错误说明:在{{“令牌之前预期的unqualified-id。我知道我的缩进很糟糕,但谢谢!

5 个答案:

答案 0 :(得分:8)

您的代码中存在很多问题。

首先,正如Ivan所指出的,您正在尝试在函数内部定义函数(ask()内部main())。这是无效的。

其次,你有一个goto(为什么?!)试图跳转到另一个函数的标签。我怀疑你的编译器是否会允许这样做,但是你希望它如何工作呢?您正在尝试使用传递给函数addition的不存在的变量,因为您从未调用该函数,并且从未为其设置过堆栈。这很糟糕,不要这样做,只需正确调用该功能。

第三,#include预处理程序指令以换行符结束,而不是分号。这可能会导致一些(相对)难以追踪编译错误。

第四,当您打算使用的是等于运算符const char*时,您错误地尝试将"Addition" operation分配给==。但这不会起作用,因为operation是一个r值,不能像那样分配。如果你想修改它,你需要将它声明为一个指针,但再一次,这不是你在语义上的目的......

如果你想比较字符串和(无论出于何种原因......)意图使用指向char的指针,那么你应该使用strcmp。也就是说,你在C ++领域,所以只需使用std:string

尝试这样的事情。无论如何我还没有增强你的代码,只是做了一些可以编译和运行的代码。我做了一些改变。

除了摆脱一些语法错误之外,原始的Add函数将结果作为float参数。从函数中分配给它只会修改副本。如果希望调用者看到修改后的值,则需要使用指针或引用,但根本不需要,只需返回结果即可。

字符串比较区分大小写,因此您可能希望将其更改为不区分大小写。我假设没有本地化:)我也没有对输入执行错误检查,因此请注意,如果用户输入的内容不是有效的浮点数,则可能会失败。

#include <iostream>
#include <string>

using namespace std;

void Ask();
float Add( float, float );

int main( size_t argc, char* argv[] )
{
    Ask();
    return 0;
}

void Ask()
{
    cout << "Type Addition, Subtraction, Multiplication, Division, Sine, Cosine, or Tangent:\n";

    string operation;
    cin >> operation;

    if( operation == "Addition" )
    {
        float first = 0, second = 0;
        cout << "enter first operand";
        cin >> first;

        cout << "enter second operand";
        cin >> second;

        cout << "The result is: " << Add( first, second );
    }
}

float Add( float first, float second ) 
{
    return first + second;
}

答案 1 :(得分:6)

С++不允许嵌套函数。你有函数main()并试图在其中声明函数ask()。编译器不知道你想要什么。

答案 2 :(得分:2)

让我们试着打破这个...... 你不应该使用;在预编译器指令上。

#include <iostream>;
#include <cmath>;
#include <string>;

应该是

#include <iostream>
#include <cmath>
#include <string>

int main () {
    int ask (){

请参阅Ivans answer了解

char operation [20];
std::cout<<"Type Addition, Subtraction, Multiplication, Division, Sine, Cosine, or Tangent:\n";
std:cin>>operation;
if (operation="Addition"){

您可以使用std::string而不是更容易处理。然后你可以写

#include <string>

...
std::cout<<"Type Addition, Subtraction, Multiplication, Division, Sine, Cosine, or Tangent:\n";
std::string myString;
getline(cin, myString);
if (myString == "Addition"){

goto Addition;
}
}
    float addition(float addend1, float addend2, float answer)
{

不确定这里发生了什么..但是让我们打破它自己的功能

void Addition(){
    // do addition here
}

Addition:
std::cout<<"Insert the first number to be added:\n";
std::cin>>addend1;
std::cout << "Insert the second number to be added:\n";
std::cin>>addend2;
answer=addend1+addend2;
std::cout<<addend1<<"+"<<addend2<<"="<<answer<<"\n";
}

不要忘记你必须定义变量

int addend1;
int addend2;
int answer;

希望这可以帮助你。

答案 3 :(得分:2)

首先是int ask()是什么。你为什么在这里开始一个块。 其次你有两个{s和三个},因为ask()。 我认为c ++不支持匿名函数。 第三个为什么你使用goto,当你有一个函数时,只需调用该函数。 Fourh你的加法函数应该是无效的或删除它的最后一个参数。 另外我认为你不需要string.h文件,除非你使用一些相当高级的函数,char数组应该足够你的程序。

答案 4 :(得分:2)

我稍微评论了你的代码,也许这会让你开始:

#include <iostream>;
#include <cmath>;
#include <string>;
int main () {
    int ask (){         //you cannot nest functions in C++

    char operation [20];    //why not use the string class if you include it anyway 
std::cout<<"Type Addition, Subtraction, Multiplication, Division, Sine, Cosine, or Tangent:\n";
    std:cin>>operation;
    if (operation="Addition"){ //you cannot compare char-strings in C++ like that
    goto Addition;      //don't use goto (I don't want to say "ever", but goto is only used in extremely rare cases) make a function call instead
}
}
    float addition(float addend1, float addend2, float answer)  //you probably want to declare the variables inside the function
{
Addition:           //don't use labels
std::cout<<"Insert the first number to be added:\n";
std::cin>>addend1;
std::cout << "Insert the second number to be added:\n";
std::cin>>addend2;
answer=addend1+addend2;
std::cout<<addend1<<"+"<<addend2<<"="<<answer<<"\n";
}