-1

我需要创建一个s由 1 和 0 组成的字符串。该字符串是根据函数返回的值创建的isSet。它总是返回1or 0。我不能简单地isSet放入一个if语句来添加1或添加0到字符串,因为程序不会编译。我是新手。我想知道是否有一种简单的方法来循环我的isSet函数,同时将它的返回值分配给我的字符串s,而它的内部bitsetfn。任何帮助表示赞赏。在 C++ 中

int isSet(unsigned int x, int i)
{
    return ((x >> i) & 1);
}

string bitsetfn(int nbits, unsigned int x)
{
    string s;
    for (int i = 0; i < 16; i++)
    {
        isSet(x, i);
        if (isSet = 0)
        {
            s = s + "0";
        }
        if (isSet = 1)
        {
            s = s + "1";
        }
    }
    return s;
}
4

2 回答 2

1

该代码中的问题是您isSet使用一些参数调用函数,然后形象地说,通过不将返回值(即函数应用程序的值)存储在变量中或立即在例如if陈述。

然后,您使用函数本身(与应用该函数的值相反,或者使用参数调用该函数的返回值)将其与0and进行比较1,这不是正确的做法。

相反,您应该做的是:

if (isSet(x, 1) == 1) {
    ...
}
if (isSet(x, 1) == 0) {
    ...
}

注意:比较运算符 is ==not =,它是赋值运算符——这几乎适用于所有现代编程语言。)

可以缩短为:

if (isSet(x, 1) == 1) {
    ...
} else {
    ...
}

...并且,在将10视为布尔值 True 和 False 的编程语言(C、C++、Python、PHP 等,但不是 Java 或 C#)中,您可以将其简化为:

if (isSet(x, 1)) {
    ...
} else {
    ...
}

此外,一般来说,特别是在具有副作用的函数的情况下(即从后续调用返回不同值或修改其环境或两者兼而有之的函数),您将希望将函数调用的返回值存储在一个变量,如果你要做的不仅仅是一个ifif-else它:

 int rnd = generateRandomValue();  // return different values on consequent calls
 if (rnd < 0.25) {
     doSomething();
 } else if (rnd < 0.5) {
     doSomethingElse();
 } else {
     doSomethingThird();
 }

在上面的例子中,如果你同时调用generateRandomValue()了 theif和这些else if行,它们将检查 2 个完全不同的值,从而导致错误的逻辑。

PS根据编程语言,整个程序可能会显着减少(例如,即使是单行,也不一定会影响可读性),但这超出了本问题的范围。

于 2013-10-17T00:29:07.360 回答
-1

您忘记将返回的值存储isSet()为局部变量。所以这一行:

isSet(x, i);

真的应该是:

int isSet = isSet(x, i);

然后,当您在后面的行中有引用时isSet,它将被定义。

编辑:请注意,正如评论所述,拥有一个与函数同名的变量通常不是一个好主意。您可以以不同的方式命名变量(并根据需要在后面的行中更改对它的引用),或者按照其他答案的建议进行操作并在比较中调用该函数。

于 2013-10-17T00:28:01.483 回答