为什么不在初始化期间声明变量在c ++中给出不同的输出[关闭]

问题描述 投票:1回答:3

当我最近在hackerearth上练习时,我在解决这个问题时发现了一个有趣的问题:https://www.hackerearth.com/practice/basic-programming/implementation/basics-of-implementation/practice-problems/algorithm/magical-tree/

我用C ++解决了它。

码:

#include<iostream>
using namespace std;
int main()
{
int l;
cin>>l;
int lInitial=l;
int max;
while(l--)
{
    string s;
    cin>>s;
    int v1=((int)s[0]-48),v2=0;
    for(int i=1;i<s.length()-1;)
    {
        v2=(int)s[i+1]-48;
        if(s[i]=='-')
            v2=-1*v2;
        v1=v1+v2;
        i=i+2;
    }
    if(l==lInitial)
        max=v1;
    else
        max=v1>max? v1 : max;
}
cout<<max<<endl;
}

对于给定的输入:

4 
8-6+2+4+3-6+1 
1+1+1+1 
2+3+6+8-9 
2+7+1-6

产量为:4197440

一旦我在初始化期间将max声明为零

int max=0;

我得到了所需的输出:10

有人可以解释为什么这种不一致存在,即使我确保在第一次循环执行变量max将采用第一个案例值v1,如下所示。

if(l==lInitial)
        max=v1;
    else
        max=v1>max? v1 : max;

我使用了他们网站上提供的代码编辑器。选择的语言是C ++(g ++ 5.4.0)谢谢:)

c++
3个回答
1
投票

因为在这一点:

if(l==lInitial)
        max=v1;
    else
        max=v1>max? v1 : max;

如果l不等于lInitial,它将执行以下行:

max=v1>max? v1 : max;

这里的问题是你将v1与尚未初始化的max进行比较。所以这是偶然的机会,如果这是真的。如果是真的,它将设置max=v1。但是,如果不是,它将设置max=max。所以它将保持与之前相同的未初始化价值。

单位化值很可能远高于您输入中的任何值,因此它总是会占用任何值。


0
投票

问题是while(l--)使用l的旧值来决定是否继续循环,然后在进入循环之前减少l。因此,第一次通过循环,l将是lInitial - 1,你不会触发if的初始化分支。


0
投票

表达式l--复制l的值,递减l并返回复制的值。在第一个循环之前,l的值等于lInitial。进入第一个循环后,执行语句l--,因此在第一个循环期间,l的值等于lInitial-1。因此,在第一个循环中,条件l==lInitial为假。

修复代码的一种方法是将lInitial的初始化更改为int lInitial=l-1;。但是,这会使你的代码“丑陋”,因为lInitial现在实际上并不包含l的初始值。

另一种方法是将if条件l==lInitial更改为l==lInitial-1

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