我需要创建一个1和0的字符串s
。该字符串是根据函数isSet
返回的值创建的。它始终返回1
或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;
}
答案 0 :(得分:1)
该代码中的问题是您使用一些参数调用函数isSet
,然后,比喻说,丢弃返回值(即函数应用程序的值),而不是将其存储在一个变量,也不是立即用于例如if
声明。
然后您正在使用函数本身(与应用该函数的值相反,或者,当使用参数调用时该函数的返回值)将其与0
和1
进行比较,这不是正确的事。
相反,你应该做的是:
if (isSet(x, 1) == 1) {
...
}
if (isSet(x, 1) == 0) {
...
}
(注意:比较运算符为==
而非=
,这是赋值运算符 - 这几乎适用于所有现代编程语言。)
可以缩短为:
if (isSet(x, 1) == 1) {
...
} else {
...
}
...而且,在将1
和0
视为布尔值True和False(C,C ++,Python,PHP等但不是Java和C#)的编程语言中,您可以减少到:
if (isSet(x, 1)) {
...
} else {
...
}
此外,通常情况下,特别是在具有副作用的函数(即从后续调用中返回不同值的函数,或者修改其环境,或两者都有)的情况下,您将希望存储返回值函数调用变量,如果你要做的不仅仅是单个if
或if-else
:
int rnd = generateRandomValue(); // return different values on consequent calls
if (rnd < 0.25) {
doSomething();
} else if (rnd < 0.5) {
doSomethingElse();
} else {
doSomethingThird();
}
在上面的示例中,如果您只是在generateRandomValue()
和if
行中调用else if
,他们将检查2个完全不同的值,从而导致错误的逻辑
PS 根据编程语言的不同,整个程序可能会大大减少(例如,即使只有一行,也不一定会损害可读性),但这超出了本问题的范围。
答案 1 :(得分:-1)
您忘记将isSet()
的返回值存储为本地变量。所以这一行:
isSet(x, i);
应该是:
int isSet = isSet(x, i);
然后,当你在后面的行中引用isSet
时,它将被定义。
编辑:请注意,正如评论所述,拥有与函数同名的变量通常不是一个好主意。您可以以不同的方式命名变量(并在适当的时候更改后面行中对它的引用),或者按照另一个答案的建议进行操作,并在比较中调用该函数。