我遇到了一个我不理解的代码。它是在一个编码网站上。代码是这样的 -
#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)
答案 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
)。然后,流类有一个转换运算符,在某些输入失败后,它将在false
或if (cin)
中返回while (cin)
。
这也适用于for
- 循环的中间部分,但有点不寻常。