C 中 int、char 和 EOF 的混淆

2023-11-21

我正在学习 K&R 的经典 C 编程书籍第二版,这是第 17 页的示例:

#include <stdio.h>
/* copy input to output*/
main()
{
    int c; 
    // char c works as well!!
    while ((c = getchar()) != EOF)
        putchar(c);
}

书中说int c用于容纳EOF,结果是-1在我的带有 GCC 的 Windows 机器中,不能用char。然而,当我尝试char c它工作没有问题。奇怪的是我又尝试了一些:

int  a = EOF;
char b = EOF;
char e = -1;
printf("%d %d %d %c %c %c \n", a, b, e, a, b, e);

输出是-1 -1 -1没有显示任何字符(实际上根据 ASCII 表%c, c这里应该有一个nbs(no-break space)显示但不可见)。

那么怎样才能char被分配给EOF没有任何编译器错误?

此外,鉴于EOF is -1, 都是b and e上面指定的FF在记忆中?不应该的,否则编译器如何区分EOF and nbs...?

Update:

最有可能的EOF 0xFFFFFFFF被投射到char 0xFF but in (c = getchar()) != EOF左心轴0xFFint 提升为0xFFFFFFFF在比较之前,所以类型c可以是int or char.

在这种情况下EOF恰好是0xFFFFFFFF但理论上EOF可以是任何需要超过 8 位才能正确表示的值,最左边的字节不一定是FFFFFF那么那么char c方法将会失败。

参考: K&R C 编程语言 2e

enter image description here


EOF and 0xFF不一样。所以编译器必须区分它们。如果您看到手册页getchar(),您会知道它会在文件末尾或发生错误时返回作为 unsigned char 强制转换为 int 或 EOF 读取的字符。

Your while((c = getchar()) != EOF)被扩展为

((unsigned int)c != (unsigned int)EOF)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中 int、char 和 EOF 的混淆 的相关文章

  • 格式说明符%02x

    我有一个简单的程序 include
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 条件类型定义

    如果我有一小段这样的代码 template
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 将点连接到图中的回归线

    考虑以下数据ISLR 书 Income lt structure list X 1 30 Education c 10 10 4013377926421 10 8428093645485 11 2441471571906 11 645484
  • 如何在PHP中从PDF表单中提取字段值[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我们正在开发基于 PHP 和 MySQL 的应用程序 我们分发 PDF 格式的注册表 填写表格后 用户将 PDF 表格上传到我们的应用程序进行注册
  • 如何防止useQuery在状态改变时运行?

    我正在使用 React Apollo 从我的服务器获取数据 当我的页面加载时 我使用 useQuery 来检索数据 这很好用 问题是当我对搜索表单进行更改时 这会更新状态 从而导致不必要的重新渲染 从而再次调用服务器 我只想在页面加载和单击
  • 如何打印lda主题模型和每个主题的词云

    from nltk tokenize import RegexpTokenizer from stop words import get stop words from gensim import corpora models import
  • 如何提前停止处理 JSP?

    我有一个 JSP 页面 它调用一个函数并检查其返回值 如果返回值不为空 JSP 页面将继续使用它 如果返回值是null 我希望JSP页面的处理停止 这是因为该函数将在返回null对象之前执行重定向 而且 其余的JSP代码显然使用了这个对象
  • django 2无法将环境变量从.env文件加载到setting.py文件

    我尝试将环境变量从名为 env 的文件加载到 settings py 文件 在这里 我创建了 env 文件和设置文件同一文件夹 这是我的 env 文件 DEBUG on SECRET KEY ksmdfw3324 jefm DATABASE
  • Android:如何从 tabhost 调用选项卡内 Activity 的函数

    我有一个带有三个选项卡的选项卡主机 每一项都是一项活动 我希望在操作栏中有一个按钮 顶部的栏上有常用按钮 调用活动选项卡的功能 例如 添加函数可以根据单击按钮时出现的选项卡向每个选项卡添加不同的内容 因此 我询问如何从 tabHost 调用
  • 从Python文本文件中的一行中提取随机单词/字符串

    我有一个文本文件 一行有六个单词 我需要从该行随机生成一个单词 文本文件名为 WordsForGames txt 我正在制作一个刽子手游戏 这是我到目前为止所拥有的 我有点迷失请帮助 import random import os prin
  • AVAsset读者寻求

    我需要寻找音频文件并提取块 我正在尝试使用 AVAssetReader 我看到的错误是 如果我在一段时间内从不同的偏移量读取音频 我得到的平均值 块 是不同的 例如 如果我从 0 1 秒到 0 5 秒读取音频 我会得到不同的结果 如果我从
  • Ansible 变量名称 `environment` 被保留?

    我今天遇到了一个奇怪的情况 我在剧本中调用了我的一个变量environment 如果我使用转储变量debug指令 显示ok environment development 但是如果我尝试使用脚本访问它 environment 它总是被赋予一
  • JavaScript 中的自动类型转换

    JavaScript 中的以下所有表达式都非常明显 var x 10 10 的价值x is 20 x 10 10 的价值x在这种情况下是1010因为 运算符超载 如果任何操作数是字符串类型 则进行字符串连接 如果所有操作数都是数字 则执行加
  • 如何从 Mac OS X 的终端运行 python 脚本而无需输入完整路径?

    我使用的是 Mac OS 10 6 Snow Leopard 我正在尝试将一个目录添加到我的 PATH 变量中 这样我就可以运行一个我编写的小脚本 只需在终端提示符下键入 python Alarm py 我将路径放入 profile 文件中
  • 覆盖/扩展 MVC 控制器/区域

    我目前正在开发一个 MVC 项目 我正在尝试弄清楚如何扩展区域内现有控制器的路由 特别是从另一个项目 例如 我有一个控制器 其区域如下所示 namespace MyProject Areas Foo Controllers Authoriz
  • 如何在 JavaScript 中计算字符串的长度(以像素为单位)?

    如何在 JavaScript 中计算字符串的长度 以像素为单位 你可以使用简单的代码 var canvas document createElement canvas var ctx canvas getContext 2d ctx fon
  • 将 localized.strings 转换为电子表格?

    是否有标准方法将 localized strings 文件转换为 csv 格式 或者可以通过 OpenOffice 等电子表格程序导入的其他格式 谢谢 答案有点过时 但是这个在线工具可以更好更快地完成工作 http localise biz
  • 如何从 Internet Explorer 中的剪贴板获取 Base64 编码的图像?

    我搜索了很多 但没有找到从剪贴板获取 Base64 编码数据 我可以捕获粘贴事件 然后将事件分配给变量 clipBoard e clipboardData e clipboardData window clipboardData 镀铬 我可
  • 为什么从 int 到 Long 的隐式转换不可能?

    我无法隐式将 int 转换为 long 并将 long 转换为 Long 为什么不能将 int 隐式转换为 Long 为什么Java不能在示例的最后一行进行隐式转换 int i 10 OK long primitiveLong i OK L
  • C++14 中的 C++17 折叠表达式有什么好的替代方案吗?

    这是 C 17 中基于 lambda 的漂亮 简洁的折叠表达式 include
  • 为一个字体系列中的每种字体分配不同的字体大小

    我正在用英语以外的语言制作网页 所以文本中包含了英语和其他语言的混合 我分配了 font family 就像 p font family EnglishFont NonEnglishFont font size 14px 它工作正常 但字体
  • C 中 int、char 和 EOF 的混淆

    我正在学习 K R 的经典 C 编程书籍第二版 这是第 17 页的示例 include