Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用for语句计算int输入的和 我昨天刚开始学习如何用C++编写代码,我在跟随Lippman的C++入门书。_C++_For Loop_Input_Sum - Fatal编程技术网

使用for语句计算int输入的和 我昨天刚开始学习如何用C++编写代码,我在跟随Lippman的C++入门书。

使用for语句计算int输入的和 我昨天刚开始学习如何用C++编写代码,我在跟随Lippman的C++入门书。,c++,for-loop,input,sum,C++,For Loop,Input,Sum,他给了我们这个密码: #include <iostream> int main() { int sum = 0, value = 0; // read until end-of-file, calculating a running total of all values read while (std::cin >> value) sum += value; // equivalent to sum = sum + v

他给了我们这个密码:

#include <iostream>

int main()

{

    int sum = 0, value = 0;

    // read until end-of-file, calculating a running total of all values read

    while (std::cin >> value)

        sum += value; // equivalent to sum = sum + value

    std::cout << "Sum is: " << sum << std::endl;

    return 0;

}
#包括
int main()
{
整数和=0,值=0;
//读取到文件末尾,计算读取的所有值的运行总数
而(标准::cin>>值)
sum+=value;//相当于sum=sum+value

std::cout您可以使用相同的
while
循环,只需扩展条件:
while((std::cin>>值)&&(0!=value))


它从
std::cin
中提取一个
int
,如果成功,则检查它是否为
0

for语句可以按以下方式查看

for ( int val1; std::cin >> val1 && val1 != 0; )
    sum += val1;
至于你的声明

for(int val1; val1 != 0; std::cin >> val1)
    sum += val1;

首先,变量
val1
最初没有初始化,因此循环是错误的。您必须检查操作
std::cin>>val1
是否成功。

您得到奇怪答案的原因是,您在初始化变量之前使用了变量
val1
。这是未定义的行为。

>
将处理该问题,因为在将值添加到总和之前,
val1将正确初始化。

问题在于,在将值添加到总和之前

您可以通过打印每次迭代时添加到总和的val1值来检查:

#include <iostream>

int main(){

    int sum = 0;

    std::cout << "Please insert your values. When you want to terminate, insert the number 0." << std::endl;
    for ( int val1;  val1 != 0; std::cin >> val1 )  {
        std::cout << "Adding " << val1 << " to the sum" << std::endl;
        sum += val1;
    }
    std::cout << "The sum of your inputs is " << sum << std::endl;

    return 0;

}
解决方案是使用用户输入的第一个数字初始化val1:

#include <iostream>

int main(){

    int sum = 0;

    std::cout << "Please insert your values. When you want to terminate, insert the number 0." << std::endl;
    int val1;
    for ( std::cin >> val1;  val1 != 0; std::cin >> val1 )  {
        std::cout << "Adding " << val1 << " to the sum" << std::endl;
        sum += val1;
    }
    std::cout << "The sum of your inputs is " << sum << std::endl;

    return 0;

}
#包括
int main(){
整数和=0;
标准::cout val1;val1!=0;标准::cin>>val1){

std::cout应该初始化变量val1,否则它将保存垃圾值。 您可以使用:

int val1;

std::cin >> val1;

for ( ;  val1 != 0; std::cin >> val1 )  {    
    sum += val1;
}      

虽然这并没有明确回答您的问题,但我想说的是,您可以通过按
Ctrl+d
手动插入
EOF
字符。输入此
EOF
字符相当于“关闭”
std::cin
,从而使您脱离依赖它的任何循环

另外,我建议您在程序中使用(并学习)一些方便的STL算法,而不是硬编码for循环

#include <iterator>
#include <iostream>
#include <numeric>

int main()
{
    auto cin_iter = std::istream_iterator<int>{std::cin};
    auto cin_end = std::istream_iterator<int>{};
    std::cout << "Sum is: " << std::accumulate(cin_iter, cin_end, 0) << std::endl;
}
#包括
#包括
#包括
int main()
{
自动cin_iter=std::istream_迭代器{std::cin};
auto cin_end=std::istream_迭代器{};

std::cout在这里使用递归可能有用。您使用的是什么操作系统/编译器?谢谢您的回答。我正在尝试避免使用关系运算符(除了!=因为我的条件需要它)因为这本书还没有提到它们,尽管我个人知道它们。我只是尽量不把本末倒置。我按照你所说的初始化了变量,并将代码修改为:
for(int val1=1;val1!=0;std::cin>>val1)sum+=val1;std::cout@NunoSimões在最后一种情况下,循环也是错误的,因为val1等于1的初始值将被添加到sum中,尽管它没有被输入。@NunoSimões噢,对不起。我没有看到你减去1。但是这种方法会让代码的读者感到困惑。@NunoSimões,而且在任何情况下你都不会检查输入是否成功。是的,我修改了“@Gernot1976 You can family”的"代码与
for
while
do
循环一起工作,但通常情况下,一个循环比另一个更适合完成任务。这种情况下,使用
do
while
循环感觉最好:强迫某人进行for循环对我来说似乎是错误的方法。这只是一种试图让事情变得更有趣的方法对我来说,在学习过程中应对挑战。我知道在这种情况下,一段时间是一个更好的选择。我认为执行的唯一for语句是第三条,我认为前两条语句刚刚初始化并检查过,但不能像处理输入那样处理订单。因此,对于您的代码,我要求输入,检查是否与零不同,如果真的前进到另一个输入。为什么它不会导致input1、check、input2和sum+=input2忽略input1?在执行主体之前,for一直到头的末尾,对吗?如果是,input1将被忽略,因为在主体执行之前,input2将存储另一个值,对吗?我缺少什么你错过了C++中for循环的确切语义,我会编辑我的答案,现在我明白了我的错误。我把循环的完整表达式理解为,在实际的循环中排除初始化,因为这只执行一次,然后进入条件、身体、后遗症、身体、后遗症、身体、后遗症等等。直到条件为假。我的印象是每次都执行初始化。书中说明了这一点,但我误解了。谢谢。
#include <iostream>

int main(){

    int sum = 0;

    std::cout << "Please insert your values. When you want to terminate, insert the number 0." << std::endl;
    int val1;
    for ( std::cin >> val1;  val1 != 0; std::cin >> val1 )  {
        std::cout << "Adding " << val1 << " to the sum" << std::endl;
        sum += val1;
    }
    std::cout << "The sum of your inputs is " << sum << std::endl;

    return 0;

}
int val1;

std::cin >> val1;

for ( ;  val1 != 0; std::cin >> val1 )  {    
    sum += val1;
}      
#include <iterator>
#include <iostream>
#include <numeric>

int main()
{
    auto cin_iter = std::istream_iterator<int>{std::cin};
    auto cin_end = std::istream_iterator<int>{};
    std::cout << "Sum is: " << std::accumulate(cin_iter, cin_end, 0) << std::endl;
}