解释for循环是如何终止的?

时间:2017-07-30 19:15:02

标签: c++ visual-c++

我遇到了一个我不理解的代码。它是在一个编码网站上。代码是这样的 -

#include<iostream>
using namespace std;

char s[4];
int x;
int main()
{
for(cin>>s;cin>>s;x+=44-s[1]);
cout<<x;
}

我的问题是 for循环是如何终止的,因为它在编码网站上,所以在我的知识中使用文件操作来检查答案。但是如果我们在IDE上运行它,那么for循环不会终止,而是继续从用户那里获取输入。那么这个解释是什么?

示例输入

3

X ++

X -

- X

输出

-1

修改

这是问题链接 - Bit++

这是解决方案链接 - In status filter set language to MS C++ Author name - wafizaini (Solution id - 27116030)

3 个答案:

答案 0 :(得分:1)

循环正在终止,因为terminal具有istream(在C ++ 11之前为operator bool()),当没有其他输入可用时返回operator void*。基本上,循环停止的原因与更常见的false循环终止的原因相同:

while

使用IDE运行时不会终止的原因是您需要提供流末尾标记,该标记以与系统相关的方式提供。在UNIX和从其派生的其他系统上,按 Ctrl + d ,而在Windows上按 Ctrl + z

注意:如果最终用户输入三个以上的字符,您的程序将面临缓冲区溢出的风险(字符#4将用于字符串的空终止符)。另请注意,抛弃初始输入while (cin >> s) { ... } ,因为在进入循环体之前会检查循环条件。

答案 1 :(得分:1)

这是完全有效的,虽然有点难以阅读,C ++ 11代码。

    $(document).ready(function() {

        var timer;

        $('#post_title').keyup(function() {

            if (timer) {
                clearTimeout(timer);
            }

            timer = setTimeout(function(event) {
                autoSave();
            }, 1000); //wait 1000 milliseconds before triggering even.

        });

        function autoSave() {
            var post_id = $('#post_id').val();
            var post_title = $('#post_title').val();
            var post_description = $('#post_description').val();
            //if(post_title != '' && post_description != '')  
            if (post_title != '') {
                $.ajax({
                    url: "save_post.php",
                    method: "POST",
                    data: {
                        postTitle: post_title,
                        postDescription: post_description,
                        postId: post_id
                    },
                    dataType: "text",
                    success: function(data) {
                        if (data != '') {
                            $('#post_id').val(data);
                        }
                        var time = showTime();
                        $('#autoSave').text("Draft Autosaved " + time).show();
                        $('#autoSave').fadeOut(3000);
                    }
                });
            }
        }
    });

  function showTime() {

    var timeNow = new Date();
    var hours = timeNow.getHours();
    var minutes = timeNow.getMinutes();
    var seconds = timeNow.getSeconds();
    var timeString = "" + ((hours > 12) ? hours - 12 : hours);
    timeString += ((minutes < 10) ? ":0" : ":") + minutes;
    timeString += ((seconds < 10) ? ":0" : ":") + seconds;
    timeString += (hours >= 12) ? " P.M." : " A.M.";
    return timeString;

  }

返回对输入流本身的引用,

std::istream::operator>>() 

反过来将流计算为布尔值,每当设置失败位时返回false。

从文件读取时,该循环最终会尝试读取文件末尾,导致eof失败位被设置,从而停止循环。

但是,在shell上运行该代码时,需要在流上手动输入EOF控制代码,否则for循环不会停止。例如,这可以通过在Unix shell上按Ctrl + D来完成。

答案 2 :(得分:0)

更常见的循环条件是while (cin >> s)

约定是operator>>返回对流的引用(cin)。然后,流类有一个转换运算符,在某些输入失败后,它将在falseif (cin)中返回while (cin)

这也适用于for - 循环的中间部分,但有点不寻常。