- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先,请原谅我问这个问题,因为它已经有几十个类似的变体了。但是,我不完全确定我是否能正确理解它。所以,请让我解释一下我设法理解的内容,如果我错了,请纠正我。
这是 K&R 书中的一个例子:
#include <stdio.h>
main()
{
1) int c;
2) 4) while ((c = getchar()) != EOF)
3) putchar(c);
}
所以,我是这样理解上面的程序的:
1) 我们将 c
声明为 int
而不是 char
因为使用了 char
数据类型不会总是正确运行,它最终会把它搞砸。 Char
数据类型因系统而异,默认情况下可以是 signed
[−127, +127] 或 unsigned
[0, 255]。此外,默认情况下,EOF
并不总是 -1
,因为它还取决于系统和编译器。
1.1) 所以,如果我们将 c
声明为 char
并且它默认为 signed char
在系统上它仍然可以工作,但如果我们输入等于 ASCII 128 及以上的字符,它会搞砸吗? 会发生什么? getchar()
将返回所选数据类型的最大可能 ASCII 值 127?
1.2) 相反,如果我们将 c
声明为 char
并且默认为 unsigned char
在系统上,那么 getchar()
将始终NOT 等于 EOF
无论如何,因为我们不能存储负值,对吗?
因为上面的所有变体,将 c
声明为 int
以避免可能的冲突是正确的吗?
2) 我们键入一些字符作为输入 c = getchar()
获取此输入并将其转换为 ASCII 数字,然后检查以确保它不等于 EOF
.
3) 如果它NOT等于EOF
,它将输入字符显示为输出。
4) 它返回到我们必须输入新字符才能继续循环的状态。
以上都正确吗?
[附加问题] 此外,语句 getchar() != EOF
将输出 1
或 0
作为值(value)。 1
值表示 getchar()
不等于EOF
。 0
作为值将告诉我们 getchar()
实际上等于 EOF
,对吧?
[其他问题] 我在 Stack Overflow 上看到另一个用户提出的另一个关于 getchar()
和 char
数据类型的问题,但是,我无法理解 Oliver Charlesworth 的答案.
Your program doesn't work fine; it won't be able to distinguish between EOF and 255.
这是什么意思?你能给我解释一下吗?另外,我也不明白这是什么意思:
0 through 7 (# 255) and EOF can be represented as 1111....32 times..... (assuming a 4 byte int)? There > will be no conflict here.
Link to the Oliver Charlesworth's answer.
更新
谢谢大家!对此:
0 through 7 (# 255) and EOF can be represented as 1111....32
times..... (assuming a 4 byte int)? There > will be no conflict
here.
如果我在下面的所有答案和解释后理解正确。这意味着 EOF
的值为 -1
将表示为 1111 1111
例如,如果数据类型为 char
然后它会认为它是#255,因为它只有 8 位,它将完全按照 0xFF (#255) 的形式存储在内存中,没有其他指示(简而言之:数据丢失,现在而不是值 -1
它的意思完全不同),对吗? 所以,为了避免这种混淆,我们在将 c
声明为 时分配 4 个字节>int
以确保不会丢失任何数据,它会将 EOF
值 -1
存储在 32 位中,例如 32 次...1111 1111
包括一个符号,表明它也是一个负值。 我理解正确吗?再次感谢!
最佳答案
您缺少的关键信息是这句话,来自 specification of fgetc
( getchar
被定义为等同于 fgetc(stdin)
):
If the end-of-file indicator for the input stream pointed to by stream is not set and a next character is present, the fgetc function [returns] that character as an
unsigned char
converted to anint
. [Otherwise, it returnsEOF
.]
强调我的。这意味着,在 unsigned char
的典型实现中可以表示 0 到 255 之间的值,getchar
将始终返回 0 到 255(含)或 EOF 范围内的值,即使 char
已签名。
与此同时,EOF 不保证为 -1(尽管它几乎总是如此),但保证为负,并且适合 int
。 .
所以,当你这样做的时候
int c = getchar();
您可以确定所有可能的返回值都不会相互冲突:c
要么是EOF
,它是负数,或者它将是 unsigned char
表示的值之一(0 到 255),它们都是非负数。如果你转换 c
回到char
在您检查它不是 EOF 之后,这就是安全的;来自 unsigned char
的转换至 char
在最坏的情况下是实现定义的。
另一方面,当你做这些中的任何一个时
char c = getchar(); // this is wrong
unsigned char d = getchar(); // also wrong
signed char e = getchar(); // also wrong
您无法将 EOF 与可能存在于文件中的某些 字节值区分开来。变量的符号无关紧要,EOF 的实际值也是如此;重要的是 char
, unsigned char
, 和 signed char
只能表示 2CHAR_BIT 个不同的值,所有这些值都可以在文件中,而 EOF 又是一个。这是 pigeonhole principle .
您应该知道 K&R 已经很老了,不再被认为是学习 C 的最佳书籍。 (我不知道目前最好的书是什么。)
关于c - 使用 int 或 char 数据类型并进行 K&R - "The C programming language"一书中的练习?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48833085/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!