不是从左到右输出吗?

问题描述 投票:0回答:2

因此,我的教授给出了一个作业,他给出了main()函数。我们将为其提供类以产生类似的输出。我尝试了很多代码,但找不到答案。当教授给我他的答案时,我似乎听不懂。

这是问题,

创建一个程序来显示三个形状的参数,即圆形,三角形和正方形。该类应能够请求用户为每种形状插入相关信息,即长度和直径,这些信息将存储在该类的私有成员中。每个形状的参数将存储在一个名为SParameter的变量中,该变量被分配为私有成员。 main()是固定的。

所以这是我教授的,

#include <iostream>

using namespace std;

class shape {
    private:
    string name;
    double length;
    double Tperimeter;

    public:
    void perimeter()
    {
    if (name == "circle")
    {
        cout<<"enter  the diameter:";
        cin>>length;
       Tperimeter = 3.142* length;
    }
    if (name == "triangle")
    {
       cout<<"enter side length:";
        cin>>length;
       Tperimeter = 3*length;
    }
    if (name == "square")
    {
       cout<<"enter side length:";
        cin>>length;
       Tperimeter = 4*length;
    }
    }

    double display(string shapename)
    {
    name=shapename;
    if (name == "circle")
    {
    perimeter();
    return Tperimeter;
    }
    if (name == "triangle")
    {
    perimeter();
    return Tperimeter;
    }
    if (name == "square")
    {
    perimeter();
    return Tperimeter;
    }
    } };

int main() {
    shape S;
    char c;
    string name;
    do
    {
    cout<<"Enter name of shape:";
    cin>>name;
    cout<<"the perimeter of "<<name<<"is:"<< S.display(name)<<endl;
    cout<<"do you wish to continue?";
    cin>    c;
    }while(c!='n');

    return 0; }

这是我的代码,

#include <iostream>

using namespace std;

class shape{ private:
    int Sparameter;
    int perimeter;
    string name; public:
    shape(){

        }
    int display(string name){
          if(name=="circle"){
            cout<<"Enter the diameter of the circle";
            cin>>Sparameter;
            perimeter=3.14*Sparameter/2;
        }
        else if(name=="square"){
            cout<<"Enter the length of the square";
            cin>>Sparameter;
            perimeter=4*Sparameter;
        }
        else if(name=="triangle"){
            cout<<"Enter the length of the triangle";
            cin>>Sparameter;
            perimeter=3*Sparameter;
       return perimeter;
        }

        } };

int main() {
    shape S;
    char c;
    string name;
    do
    {
    cout<<"Enter name of shape:";
    cin>>name;
    cout<<"the perimeter of "<<name<<"is:"<< S.display(name)<<endl;
    cout<<"do you wish to continue?";
    cin>>    c;
    }while(c!='n');

    return 0; }

所以我的问题在输出上,如果使用Codeblock,这是我和我的教授代码的输出。

输入形状名称:圆形圆的周长:输入直径:1031.42您要继续吗?

“圆的周长”的提示将出现在“输入直径”之前。但是,如果使用在线gdb之类的在线编译器。对于我的教授的代码,其输出是不同的。

输入形状名称:圆形输入直径:30圆的周长:94.26您要继续吗?

“输入直径”部分将出现在“圆的周长”之前,即使在cout部分中“圆的周长”位于调用S.display()函数之前。

cout <

那么输入直径如何首先出现?我问我的教授,他说关键是在一个函数内调用一个函数。但这并不能为我解释太多,我想念什么吗?程序的流程不是从左到右吗?

谢谢。

c++ function codeblocks cout
2个回答
0
投票
我想尝试一下此代码,我在我的编译器/文本编辑器(Atom)和在线编译器上进行了尝试。我只是将类型更改为double,因为您将要处理浮点数

0
投票
让我们分解一下这个表达式:

cout<<"the perimeter of "<<name<<"is:"<< S.display(name)<<endl; // ^ // | // I'm going to focus on this << operator

由于未指定计算操作数的顺序,因此编译器可以选择首先评估标记的运算符的左侧还是右侧。对两个操作数的求值都有副作用(即打印输出),因此这些副作用可以按任何顺序出现。

如果编译器选择首先评估左侧(cout<<"the perimeter of "<<name<<"is:"),则其输出将首先出现,并且您将看到类似的输出

    Enter name of shape:circle the perimeter of circleis:enter the diameter:10 31.42 do you wish to continue?
  • 如果编译器选择先评估右侧(S.display(name)),则其输出将首先出现,并且您将看到类似的输出
    Enter name of shape:circle enter the diameter:30 the perimeter of circleis:94.26 do you wish to continue?
  • C ++ 17纠正了所有这些问题。现在需要从左到右对操作数进行求值,因此,如果使用兼容C ++ 17的编译器进行编译,则始终会看到输出,例如
    Enter name of shape:circle the perimeter of circleis:enter the diameter:10 31.42 do you wish to continue?

    编译器

    无法选择在S.display(name)之前评估cout<<"the perimeter of "<<name<<"is:"

    这说明了您看到的不同输出。您的本地编译器选择首先评估<<运算符的左侧,而在线编译器选择首先评估右侧的运算符。

© www.soinside.com 2019 - 2024. All rights reserved.