关于while (std::cin >> val) 的一些思考

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

P19上,有一段代码如下:

#include <iostream>

int main()
{
	int sum = 0, value;
	// read till 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;
}

这段代码虽然简单,但在看while (std::cin >> value)时,仍然觉得有些东西值得思考。

目前,在这一章书上有讲到 std::cin >> value 返回值是一个 std::cin 对象。故输入有效时,返回 std::cin ,而输入无效或是end-of-file字符时,返回的可能是个null或是一个逻辑值为false的值。

而我好奇的便是,输入空格的时候是什么情况?因为空格似乎很特殊,既不是end-of-file;在该段代码中,也不是有效值。


待读完第八章,The IO Library后,终于有了一个很好的认识。

使用cin就暗含了,以空格作为分隔符(准确的说是White space)。举个例子:

string s;
while(cin >> s)
    cout << s << endl;
对于该段代码,若输入Hello World(Hello和World中有空格,或者制表符)。则输出为:

Hello

World

等价于,输入Hello后回车,然后输入World。这就是因为cin将White space当作一个结束标志。

若希望通过标准输入流输入空格或者制表符,需要用getline(cin, s)函数。而不要使用 >> operator。

C++——5.控制流:if、switch、for、while、do-while 本文介绍了C++中的条件控制语句,主要包括if-else和switch两种结构。对于if-else语句,详细说明了基本语法、带初始化器的if语句(C++17特性)、悬空else问题以及条件表达式中的常见陷阱。特别对比了普通if与constexpr if的区别,后者用于模板编程中的编译期条件判断。 对于switch语句,阐述了其基本结构、case标签的要求以及break的重要性,介绍了带初始化器的switch(C++17)以及使用[[fallthrough]]属性明确表示case穿透意图的用法。通过多个代码示 阅读详情

相关推荐

深入C++标准库:从缓冲区与流绑定的视角,重新理解ios::sync_with_stdio和cin.tie

本文深入探讨C++标准库中`ios::sync_with_stdio`和`cin.tie`的底层机制,揭示它们如何通过改变流的缓冲策略和绑定关系来提升IO性能。文章详细分析了同步模式与非同步模式的差异、流绑定机制的设计初衷及其性能影响,并提供了多线程环境下的安全策略和编译器实现的差异对比,帮助开发者优化C++程序的输入输出效率。

weixin_30325971的博客 341

while(cin >> s)结束问题

#include using namespace std; int main() { int sum = 0,s; while(cin >> s) sum += s; cout << sum << endl; return 0; } 像上面的代码一样的,可以用ctrl + z来结束输入!!!!!

奋斗的Die Young 1869

C++循环结构实战:从找最小值问题掌握遍历与比较算法

循环结构是编程语言中的基础控制结构,它允许程序重复执行特定代码块,是实现数据遍历和批量处理的核心机制。其原理是通过初始化、条件判断和迭代更新三个环节来控制代码的重复执行。掌握循环结构的技术价值在于能够高效处理集合数据,实现自动化操作,这是算法设计和程序优化的基石。在应用场景上,循环广泛用于数据遍历、统计计算、搜索查找以及批量任务处理。本文以C++中经典的“找最小值”问题为例,深入剖析for循环和while循环的实现细节,并探讨变量初始化和边界条件处理等关键技巧,帮助读者通过具体案例透彻理解循环结构的精髓与常

weixin_30439067的博客 291

如何结束一个whilecin>>s)的循环

正常的whilecin>>a)(如何a是一个整数,我们再输入一个字母机会结束) 如果whilecin>>s)那么我们可以通过加入一个判断while(cin>>s) { if(s=="end") Break; ....... ...... ...... }

zwz2011303359的博客 6871

2017 Tencent实习编程题

题目来源:点击打开链接 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。 输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1 输出描述: 对于每组数据,输出一个整数,代表最少需要删除的字符个数。 输入例子: abcda google 输出例子: 2 2 思路分析:    可利用最长

alvinzxf的博客 434

结束while(cin >> value)

当看《c++ primer》这本书的时候有这样一段示例代码#include <iostream> int main(){ int val,sum=0; while(std::cin>>val){ sum+=val; } std::cout<<"the result is "<<sum<<std::endl; return 0; }当自己在终端调

D 4980

while(std::cin>>val)怎么结束的思考

参考:https://blog.csdn.net/u014182411/article/details/62053816/ --------------------------------------------------------------- cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,...

weixin_30911809的博客 210

C++11 多线程(std::thread)详解

本文介绍了C++11标准库中的std::thread多线程编程基础。

jcShan709的博客 15万+

C++ std::string 深度解析:从内存管理到性能优化的完整指南

在C++编程中,字符串处理是基础且核心的技术环节。其原理基于动态内存管理和RAII(资源获取即初始化)原则,通过封装字符数组自动处理内存分配与释放,从而避免手动管理内存的复杂性和缓冲区溢出等安全隐患。这一设计带来了显著的技术价值:不仅提升了代码的安全性和可维护性,还通过短字符串优化(SSO)等机制优化了性能。在实际应用场景中,无论是数据清洗、日志解析还是日常的文本操作,高效且安全的字符串处理都至关重要。本文聚焦于C++标准库中的`std::string`,深入探讨其内部实现、内存布局、常用操作及性能陷阱,并

weixin_34049948的博客 328

C++输入流解析进阶:从cin局限到自定义分隔符处理实战

在C++编程中,输入流处理是数据读取的基础操作。标准库提供的cin和getline函数虽然便捷,但在面对复杂分隔符时存在局限。其原理在于流提取操作符遇到非目标字符会停止,导致数据解析错乱。掌握自定义分隔符解析技术,能显著提升代码的鲁棒性和灵活性,在处理CSV文件、日志记录、网络协议等实际场景中尤为重要。通过组合使用istringstream与getline,开发者可以高效拆分逗号、空格等混合分隔的数据。进一步地,结合字符串修剪、自定义分词函数乃至正则表达式,能够应对更复杂的格式化文本。本文以C++输入流为核

weixin_30402343的博客 328

C++ std::string 深度解析:从内存管理到高效编程实践

在C++编程中,字符串处理是基础且高频的操作,其性能直接影响程序效率。理解字符串类的核心原理,如内存管理和值语义,是编写高效代码的关键。RAII(资源获取即初始化)机制确保了内存的自动管理,避免了手动释放的常见错误,而值语义则保证了数据的独立性。在工程实践中,通过预分配内存和利用短字符串优化(SSO)等技术,可以显著提升字符串操作的性能,例如在循环拼接或高频访问场景下避免不必要的内存分配与拷贝。这些优化技术广泛应用于网络通信、文件解析和数据处理等场景。本文聚焦于C++标准库中的std::string,深入探

weixin_30457465的博客 304

C++ std::async 异步编程:核心机制、应用场景与避坑指南

异步编程是现代软件开发中提升性能与响应能力的关键技术,其核心思想是将耗时的操作(如计算、I/O)放到后台执行,避免阻塞主线程。在C++中,std::async是实现异步任务的重要工具,它基于std::future机制,允许开发者以类似函数调用的方式启动异步操作,并获取未来结果。其技术价值在于简化了线程管理,降低了并发编程的心智负担,使得开发者能更专注于业务逻辑。std::async广泛应用于并行计算、后台I/O操作、超时控制等场景,例如在处理CPU密集型任务或网络请求时,能有效提升程序吞吐量。然而,其默认启

weixin_33782386的博客 289

C++循环结构详解:for/while/do-while核心用法与性能优化

循环结构是程序流程控制的基础概念,它通过重复执行特定代码块来实现批量数据处理和自动化任务。其核心原理在于通过条件判断或计数器控制代码块的重复执行,从而提升代码复用率和执行效率。在技术价值层面,循环是算法实现、数据遍历和持续交互的基石,直接影响程序的时间复杂度和性能表现。应用场景广泛涵盖数组遍历、用户输入验证、菜单驱动系统以及各类数据处理算法。本文聚焦C++语言中的循环实现,深入解析for、while和do-while三种循环结构,并结合范围for循环和STL算法等现代C++特性,探讨如何避免死循环、差一错误

weixin_34007886的博客 454

C++ std::string 深度解析:从RAII原理到实战性能优化

在C++编程中,字符串处理是基础且高频的操作。传统C风格字符串需要手动管理内存,容易引发缓冲区溢出和内存泄漏等问题。现代C++通过RAII(资源获取即初始化)机制,将内存管理与对象生命周期绑定,实现了安全高效的资源自动管理。std::string作为标准库的核心组件,正是这一思想的典型代表。它内部封装了动态字符数组,自动处理内存分配、扩容与释放,同时提供了丰富的成员函数和迭代器支持,使其能无缝融入STL算法生态。在工程实践中,理解其容量管理机制(如reserve方法)和避免常见陷阱(如c_str指针失效)至

weixin_33693070的博客 377

C++ std::map 完全指南:从红黑树原理到实战应用

在C++编程中,关联容器是处理键值对数据结构的核心组件,它基于红黑树实现,确保了元素的有序性和操作的稳定性。红黑树作为一种自平衡二叉搜索树,通过严格的着色和旋转规则,将查找、插入和删除的时间复杂度稳定在O(log n),为需要有序遍历和范围查询的场景提供了可靠保障。这种数据结构在工程实践中价值显著,尤其适用于学生成绩管理、单词统计、缓存系统等需要快速查找且保持顺序的应用。本文以std::map为例,深入解析其底层红黑树机制,并通过实战案例展示如何高效进行增删改查和自定义排序,帮助开发者掌握这一关键容器,提升

weixin_34218890的博客 367

C++流程控制语句深度解析:从基础语法到实战应用

流程控制是编程语言的核心概念,它决定了程序的执行顺序和逻辑分支。其基本原理是通过选择、循环和跳转等语句结构,指挥计算机按照预设的逻辑路径执行任务。掌握流程控制对于编写高效、可维护的代码至关重要,是构建复杂算法和软件系统的基石。在C++中,流程控制语句包括选择语句(如if、switch)、迭代语句(如for、while)和跳转语句(如break、continue、return)。这些语句的合理运用能显著提升代码的清晰度和执行效率,广泛应用于算法实现、用户交互处理、数据遍历和错误处理等场景。本文以C++17标准

weixin_33733810的博客 425

C++标准库排序与二分查找:算法基石与高效应用指南

排序与二分查找是计算机科学中处理有序数据的核心算法,其原理基于分治与比较,能在对数或线性对数时间内完成数据组织与检索,技术价值在于极大提升了数据处理效率。在工程实践中,它们广泛应用于数据库索引、搜索引擎、游戏道具系统及各类需要快速查询与统计的场景。C++标准库(STL)为此提供了高度优化且易用的工具,如 `std::sort` 函数和 `lower_bound` 等二分查找函数族。掌握这些工具,尤其是理解其严格的比较函数规则和边界条件,能帮助开发者避免常见陷阱,编写出高效、健壮的代码,从而在算法面试和实际项

weixin_30312563的博客 307

【项目】C++从零实现JsonRpc框架——项目引入

本文介绍了一个基于C++实现的简易RPC通信框架,使用JsonCpp库进行序列化/反序列化,muduo网络库处理底层通信。该框架支持同步/异步调用、服务注册发现、负载均衡等功能,通过JSON格式传输参数和返回值,使开发者无需关注网络细节即可快速实现远程调用。文章详细讲解了JsonCpp的核心类和使用方法,并简要介绍了muduo库的高性能网络架构特点。该RPC框架设计简洁高效,适合快速开发分布式系统服务。

记录我一步步的学习历程,期待无限进步,向星举目! 692

读入未知数目的输入方法和该方法的条件测试原理

这是学习C++基础知识的一点笔记吧。今天主要想记录的是关于【】

Dare to be different , Make it ! 900
上一篇: C++中声明和定义知识点的梳理
下一篇: 如何学好Objective-C
yang1201
博客等级 码龄14年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值