在 char 中分配多个字符

2024-01-19

为什么这个程序给出输出'y'

#include <stdio.h>

int main(void) {
    char ch='abcdefghijklmnopqrstuvwxy';
    printf("%c",ch);
    return 0;
}

代码在ideone http://ideone.com/vtuMBK


这是一个多字符文字。

包含多个 c 字符的普通字符文字是 多字符文字。多字符文字的类型为 int 且实现定义的值.

也来自 C11 规范中的 6.4.4.4/10

整型字符常量的类型为 int。整数的值 包含映射到的单个字符的字符常量 单字节执行字符是数值 解释为整数的映射字符的表示形式。这 包含多个的整型字符常量的值 字符(例如,'ab'),或包含字符或转义序列 不映射到单字节执行字符, is 实现定义的。如果整型字符常量包含 单个字符或转义序列,其值是结果 当一个 char 类型的对象的值是 single 的时候 字符或转义序列转换为 int 类型。

所以这条线char ch = 'abcdefghijklmnopqrstuvwxy'在您的系统上(假设 4 字节 int)可能会编译为:

char ch = 0x76777879;  // SOME int value (may be different, but documented in the compiler documents)

ch将被分配'abcdef...y' which may be相当于 http://ideone.com/SfhNNO (int)0x616263646566...79以 ascii 编码并溢出整数。这就是为什么gcc生成以下警告:

multicharlit.c:在函数“main”中:
multicharlit.c:4:13:警告: 字符常量对于其类型来说太长[默认启用]
multicharlit.c:4:5:警告:隐式常量转换中溢出 [-Woverflow]

在您的系统上显示,最低有效 8 位用于分配ch。因为您的字符文字是恒定的,所以这很可能在编译时发生:(例如,当我使用以下命令进行编译时,会发生以下情况gcc)

$ cat multicharlit.c
#include <stdio.h>

int main(void) {
    char ch='abcdefghijklmnopqrstuvwxy';
    printf("%c",ch);
    return 0;
}

$ gcc -O2 -fdump-tree-optimized multicharlit.c 
$ cat multicharlit.c.143t.optimized 

;; Function main (main) (executed once)

main ()
{
<bb 2>:
  __builtin_putchar (121);
  return 0;

}

也偷走了一些美好放松的评论 https://stackoverflow.com/questions/31335472/assigning-more-than-one-character-in-char#comment50655643_31335472

请记住,单引号字符常量的类型是int, 但你把它分配给char,所以它必须被截断为 单个字符。

Type of 'a'例如是int in C。 (不要与'a' in C++这是一个字符。另一方面类型'ab' is int in both C and C++.)

现在当你分配这个int键入一个char类型和值超出了可以表示的范围char,然后需要进行一些压缩以使结果适合不太宽的类型char实际结果是实现定义的。

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

在 char 中分配多个字符 的相关文章

随机推荐

  • 路径前缀 \??\ 和 \\?\

    前缀为 的路径有什么区别 以及那些前缀为 在 Windows 7 CMD 行 DIR 给出 Volume 00000000 0000 0000 0000 000000000000 WMIC 音量列表给出 Volume 00000000 00
  • 移动学生如何有效地使用带有源代码控制系统的 Dropbox?

    我买了一台笔记本电脑 为下个学期做准备 这将使我在全职工作的同时参加大学编程课程 当然 我会使用源代码控制系统 可能是 Subversion 并想到在我的 Dropbox 文件夹中创建我的存储库 这将使我能够使用我的笔记本电脑或台式机 或者
  • 错误:“y_true 中的类数不等于 'y_score' 中的列数”

    我有一个不平衡的多类数据集 当我尝试计算 roc auc score 时 我收到此错误 ValueError y true 中的类数不等于 y score 中的列数 这是代码 model svm SVC kernel linear prob
  • 使用 Firefox Addon SDK 列出所有驱动器

    是否有跨操作系统的方法来使用 firefox addon sdk 列出所有已安装驱动器 硬盘 USB 驱动器等 的路径 我找到了适用于 Windows 的代码 但找不到跨操作系统的解决方案 Components utils import r
  • LINQ to XML - 尝试通过元素的属性值选择元素列表

    我试图从 XML 文档中获取元素列表 其中节点具有特定的属性值 该文档的结构如下
  • 从 C# 中的函数返回类

    我可以从 C 中的函数返回类对象作为返回值 而不是返回 string 或 int 或 etc C 中的类对象是一种类型 所以你绝对可以从函数返回它 public Type Foo return typeof string public Ty
  • OpenMp 与 IOS/Android 的兼容性

    我正在尝试做什么 我正在研究C c 为所有平台构建产品的代码 我操作系统 Android Windows 移动 桌面 Mac Linux 到目前为止我做了什么 是的 有许多在线链接讨论 OpenMp 与不同处理器和操作系统的兼容性 但很难从
  • xmpp框架iOS新用户注册方法

    我已经开发了适用于 iOS 的 XMPP 聊天客户端 现在我正在研究如何从 iOS 本身进行新用户注册 任何人都可以帮助注册新用户的方法 因为它需要与服务器通信并将用户名和密码存储到服务器数据库中 请帮帮我 我已经搜索了两天了 NSMuta
  • cursor.fetchone() 返回 None 但数据库中的行存在

    我正在用 python 编写一个与 MySQL 数据库交互的程序 对于 sql 查询 我使用 MySQLdb 问题是fetchone 返回 None 但通过数据库浏览器我可以看到that行存在 这段代码 query SELECT FROM
  • 如何使用Python库生成后缀树? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要可以构建后缀树 特别是广义后缀树的Python库 你能给我推荐一些图书馆吗 谢谢 请参阅以下库
  • 在 JApplet 上运行的 JPanel

    我正在设计一个 JApplet 基本上这个小程序将允许用户绘制二次方程图 并插入 x 轴和 y 轴的范围 但要达到这一目标 还有很多工作要做 我仍处于设计界面的阶段 这是我的代码 import java awt Dimension impo
  • Spring启动-配置EntityManager

    我正在使用Google guice在我的项目中 现在我尝试将框架转换为SpringBoot完全 我配置了 Beanpersistence xml like below in Autowired Bean name transactionMa
  • Java awt.Robot:CTRL+ALT+DEL 未调出所需的屏幕

    我最近刚刚发现 awt Robot 库 我很高兴能够使用它 我以为我应该对我的朋友开个小恶作剧 让机器人按控制 Alt 删除按锁定计算机按钮 但我无法让程序调出控制 Alt 删除屏幕 这是我的代码 import java awt impor
  • 构建发布时出现颤动警告

    当我尝试构建 release 我的应用程序时 我不断收到这些红色警告 尝试扑干净 flutter clean cache 没有任何作用 所有包都是最新的 我的构建 Gradle buildscript ext kotlin version
  • 高效地将字节数组转换为十进制

    如果我有一个字节数组并且想要转换该数组的连续 16 字节块 其中包含 net 的表示形式Decimal 转化为适当的Decimalstruct 最有效的方法是什么 在我正在优化的情况下 以下代码在我的分析器中显示为最大的 CPU 消耗者 p
  • 如何在.NET Framework 3.5上使用Stream.CopyTo?

    我找到了上传代码 该代码包含Stream CopyTo method Example file Stream CopyTo requestStream NET Framework 4 0 如何将 file Stream 复制到 reques
  • 比较 list 类型的 Python 字典值,看看它们是否按顺序匹配

    prefs s1 a b c d e s2 c d e a b s3 a b c d e s4 c d e b e 我有一本字典 我想比较每个键的值 类型 列表 以查看它们是否按该顺序存在 因此 本质上我试图迭代每个键值对 并将列表类型的值
  • 在 Android 中从 Facebook 检索用户名和性别

    这就是我检索存储在共享首选项中的信息 然后比较用户名和密码是否存在的方法 如果用户登录 我可以显示另一个活动 SharedPreferences 设置 getSharedPreferences logindetails 0 String u
  • Java 中的悬空线程

    Java 中的悬空线程会发生什么 就像我创建一个应用程序并且它生成多个线程一样 其中一个线程未完成 主程序在此之前完成 这条悬空的线会发生什么 它会无限地留在线程池中还是 JVM 将在阈值时间段后杀死线程 这取决于线程是否被标记为 守护进程
  • 在 char 中分配多个字符

    为什么这个程序给出输出 y include