将函数结果赋给变量的问题

时间:2017-09-06 15:21:11

标签: c++ size

#include <iostream>
#include <string>
using namespace std;

int main() {
   string userInput;
   int stringSize = 0;

   userInput = "Hello";

   userInput.size() == stringSize;

   cout << "Size of userInput: " << stringSize << endl;

   return 0;
}

我试图获得5的输出,但它返回0.我无法弄清楚出了什么问题。 userInput“Hello”的大小应为5,userInput.size()应返回5.这应该分配给变量stringSize。旁注,任何人都可以向我解释为什么它是“==”而不是“=”?如果我用“=”尝试它,它不会编译,我得到这个错误:

main.cpp: In function ‘int main()’:
main.cpp:11:23: error: lvalue required as left operand of assignment
    userInput.size() = stringSize;
                       ^~~~~~~~~~

我的理解是“=”是赋值,“==”是布尔比较,它是“真”或“假”,取决于双方是否相等。我试图将userInput.size()的大小分配给变量,所以我认为我应该使用“=”。也许这是问题的一部分?

5 个答案:

答案 0 :(得分:2)

以下是要求的答案(PacO的学分):

您始终必须将要分配的值放在= - 运算符右侧的变量中,并将变量本身放在左侧。

您所做的是尝试将stringSize的值分配给userInput.size()

答案 1 :(得分:2)

  

我的理解是“=”是赋值,“==”是一个布尔比较   这是“真”还是“假”,取决于双方是否相等。

到目前为止,您的理解是正确的。

  

我正在尝试将userInput.size()的大小分配给变量   所以我认为我应该使用“=”

一般来说,你不能写private static void piePiece(GraphicsContext context, double width, double height, double radius, double angle) { double cx = width / 2; double cy = height / 2; context.moveTo(cx, cy); context.lineTo(cx + radius, cy); context.arc(cx, cy, radius, radius, 0, angle); context.closePath(); } @Override public void start(Stage primaryStage) { Canvas canvas = new Canvas(600, 600); GraphicsContext gc = canvas.getGraphicsContext2D(); // rotation matrix rotating by 30° around (300, 300) Affine rotate = new Affine(new Rotate(30, 300, 300)); // draw first pie gc.beginPath(); piePiece(gc, 600, 600, 250, 30); gc.stroke(); gc.save(); // create clip gc.beginPath(); piePiece(gc, 600, 600, 250, 30); gc.clip(); List<List<Point2D>> points = new ArrayList<>(); Button btn = new Button("Complete"); btn.setOnAction((ActionEvent event) -> { // draw data stored in points variable // remove old clip gc.restore(); for (int i = 30; i < 360; i += 30) { // rotate by 30° gc.transform(rotate); gc.save(); // draw piece gc.beginPath(); piePiece(gc, 600, 600, 250, 30); gc.stroke(); // create clip gc.beginPath(); piePiece(gc, 600, 600, 250, 30); gc.clip(); // draw lines for (List<Point2D> lines : points) { if (lines.size() >= 2) { Iterator<Point2D> iter = lines.iterator(); gc.beginPath(); Point2D p = iter.next(); gc.moveTo(p.getX(), p.getY()); while (iter.hasNext()) { p = iter.next(); gc.lineTo(p.getX(), p.getY()); } gc.stroke(); } } // remove clip gc.restore(); } }); class PressedHandler implements EventHandler<MouseEvent> { List<Point2D> line; @Override public void handle(MouseEvent event) { if (line == null) { // add new line to lines list line = new ArrayList<>(); line.add(new Point2D(event.getX(), event.getY())); points.add(line); gc.beginPath(); gc.moveTo(event.getX(), event.getY()); } } } PressedHandler handler = new PressedHandler(); canvas.setOnMousePressed(handler); canvas.setOnMouseDragged(event -> { if (handler.line != null) { // append point to line handler.line.add(new Point2D(event.getX(), event.getY())); gc.lineTo(event.getX(), event.getY()); } }); canvas.setOnMouseReleased(event -> { // complete line handler.line = null; gc.stroke(); }); VBox root = new VBox(btn, canvas); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.show(); } 分配中的左右不可交换,顺序很重要。

如果要为某个变量指定值,则该变量必须位于作业的左侧5 = variable

我使用了这种简化,但函数size()的结果与我的示例中的5相似。这称为 rvalue (如“right-value”)。

因此,在您的情况下,variable = 5是正确的,并将stringSize = userInput.size();的大小设置为变量userInput(称为左值值可以在作业的左侧分配。

答案 2 :(得分:1)

左值可以看作是在其使用之后存在的命名值,例如变量。 rvalue不会在其使用之后持续存在,通常是函数调用的结果或者我们通常称之为“值”的结果。

您可以将左值存储在左值(int i = 2 + 3)中,但不能将左值分配给右值。这就是你的问题存在的地方

编译器抛出一个错误,因为你有一个右值userInput.size()并且你通过尝试为它赋值来将它视为左值。

userInput.size() = stringSize

一个更简单的例子是

int n = 1;
3 = n;

出于显而易见的原因,你不能只改变3是什么。在您的示例中,您的函数只返回一个整数值...那么为什么您应该更改它?所以你得到一个错误

答案 3 :(得分:0)

不同的观点:

您无法设置字符串的大小。 std::string类会自动为您计算长度。

所以不需要表达式:

userInput.size() = stringSize;

要清除std::string的内容,请使用clear()方法:

userInput.clear();

答案 4 :(得分:0)

  

=是C,C ++和其他编程语言中的赋值运算符。

     

==指定右侧表达式或变量的值   值为左侧变量。

简单示例:

int x,y;
x=10;
y=10;

if(x==y)
    printf("True");
else
    printf("False");

输出将是:True

在您的情况下,您必须使用一个=运算符并将函数赋值放在变量的右侧。像这样stringSize = userInput.size();

这是最终代码:

#include <iostream>

using namespace std;

int main()
{
    string userInput;
   int stringSize = 0;

   userInput = "Hello";

    stringSize = userInput.size(); //this line edited.

   cout << "Size of userInput: " << stringSize << endl;

   return 0;

}

online_c++_compiler