为什么我不能将一个变量的值赋给另一个变量?

14

我有两个变量,我想分别处理较大和较小的变量。

我的方法:

a = 1;
b = 2;

if (a >= b){
    int c = a;
    int d = b;
}
else{
    int c = b;
    int d = a;
}

我遇到了一个未使用变量的错误,当我稍后尝试使用 cd 时,它会显示

c 无法解析

有没有解决方法?


这提供了一些关于在程序中声明变量的位置如何影响你在后续程序中使用它们的指导。 - abcalphabet
3
在if语句中声明的变量的作用域取决于编程语言。在某些语言中,它们的作用域只存在于if语句块内部,而在其他语言中,它们的作用域可能会扩展到包含if语句的代码块中。因此,要了解具体情况,需要参考所使用的编程语言的文档或规范。 - jpmc26
4个回答

30
在这两种情况下,cd都被限定在if else块中的大括号范围内,因此你不能在外部访问它们。
你需要以下形式的内容:
int c, d;
if (a >= b){
    c = a;
    d = b;
} else {
    c = b;
    d = a;
}

21

正如其他人指出的那样,这里的问题在于你声明变量的位置。你不能在声明的范围之外使用它们,因此会导致错误。

如果你可以使用C++17,你可以通过使用std::minmax结构化绑定来修复代码,例如:

int main()
{
    int a = 5, b = 10;
    auto [min, max] = std::minmax(b, a);
    std::cout << min << " " << max;
}

这真的很好,因为现在您不会有任何时间未初始化的变量。


2
这非常非常好。 - Bathsheba
2
@Bathsheba 是的。我喜欢它,因为它非常清晰地表达了你想要做什么。从可维护性的角度来看,这是非常宝贵的。 - NathanOliver

6
这是因为您在一个if语句中声明变量。从逻辑上讲,您可能认为else会以某种方式保证如果声明在if块和else块中,则变量将被分配。
正确的方法是在if块之前声明变量,否则变量使用将被限制为它声明的作用域。
此外,您可以使用三元操作而不需要if和else来实现这一点。
        int a = 1;
        int b = 2;

        int c = a >= b ? a : b;
        int d = b < a ? b : a;

使用这种语法,您可以避免为简单的变量赋值编写if和else块。在“?”后面的变量是条件为真时的结果,“:”后面的变量是条件为假时的结果。

1
问题不在于在if语句中设置变量,而在于在其中声明它们。 - Angew is no longer proud of SO
1
我没有点踩,但这肯定是因为缺乏解释。 - Cid
2
它与变量“设置”的位置无关,而与它们声明的位置有关。这个答案确实需要更详细的解释。 - NathanOliver
1
@Angew 已经明白了。当然这就是我的意思。我会进行编辑。 - Elroy Jetson
1
三元运算符的问题在于你基本上重复了条件检查。 - Bathsheba
显示剩余7条评论

4

这是一个作用域问题,你在作用域内创建了变量,所以它们无法在外部访问。

if (a >= b){
    int c = a;  // c and d belongs to that if scope
    int d = b;
}
else{
    int c = b;  // c and d belongs to that else scope
    int d = a;
}

将您的代码更改为:

a = 1;
b = 2;
int c;
int d;

if (a >= b){
    c = a;
    d = b;
}
else{
    c = b;
    d = a;
}
// You can now call c and d there

缩短该代码的方法是存储a >= b的布尔值,并在三元表达式中使用它来设置cd

例如:

a = 1;
b = 2;
bool IsAGreaterOrEqualToB = (a >= b);
int c = ((IsAGreaterOrEqualToB) ? (a) : (b));
int d = ((IsAGreaterOrEqualToB) ? (b) : (a));

2
你有很多括号,为什么?此外,我会添加一些const,但除此之外,这很好。更喜欢初始化而不是赋值! - Lightness Races in Orbit
2
好的,但为什么呢?这只会增加噪音!? (a) : (b)? a : b 更难读 :( - Lightness Races in Orbit
@Cid:顺便说一下,在C++中,这有时是有害的。 - Bathsheba
@LightnessRacesinOrbit 这只是一种习惯,它帮助我分离不同的部分(特别是当我写一些嵌套的三元运算符时)。如果您认为这样更易读,请随意编辑我的答案,答案是为他人而做的。 - Cid
@Bathsheba,您能给我指一些例子吗?我很好奇。 - Cid
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接