C语言辨析——深入理解字符常量与表达式

文章分析了字符常量的定义及其类型,指出C标准中字符常量转换为整数的值可能不一致,影响程序可移植性。讨论了两个编程题目中的选项,揭示了题目可能存在错误,强调了理解和遵循标准的重要性。
摘要由CSDN通过智能技术生成

1. 问题

今天看到一个题目,截图如下。

图片

从答题情况来看,本题的答案是B,那么就意味着A、C、D是错的。但我认为这4个选项都是对的。当然,如果要从4个选项中挑选一个的话,那还是选择B妥当一些。

2. 分析

字符常量的定义:字符常量(Character constant)是由一对单引号括起来的一个字符序列,例如,'a'、'b'、'1'和 '\123' 等都是有效的字符常量。在大部分编译系统中,一个字符占一个字节,并使用ASCII码值表示字符。例如,字符'A'的ASCII码值为65,即用65表示字符'A'。

字符常量可以带有一个前缀,不带前缀的字符常量默认类型为int,这类字符常量称为整数字符常量。如果字符常量的前缀是L,则其类型为wchar_t;如果前缀是u,类型是char16_t C11起);如果前缀为U,类型为char32_t C11起)。wchar_tchar16_tchar32_t等类型的字符常量通称为宽字符常量。如果字符常量的前缀是u8,则其类型为char8_tC23起),该类型与unsigned char相同。

在C标准中进一步对整数字符常量进行解释:对于单个字符的整型字符常量的值映射到文字编码中的单个值(注,在实现中一般采用ASCII码),其值是被映射字符在文字编码中表示为整数的数值。包含多个字符(例如’ab’)的整数字符常量的值,或者包含没有映射到文字编码中的单个值的字符或转义序列的值由实现定义

以上内容均来自C标准。由C标准可知选项A的赋值语句是正确的,只是字符常量‘a+b'转换为int类型数时的值是由实现定义,减弱了程序的可移植性。

对于选项C和D,没有什么可说的,它们两个就是正确的赋值语句,对于C选项,字符常量’7‘和'9',它们的类型都是int,如果字符编码采用ASCII,它们的值分别是0x37和0x39,两者相加结果是0x70,0x70对于的字符是'p',因此,对于C选项,赋值语句执行后ch的值为字符'p'。

对于D选项,5+9等于14,如果字符编码采用ASCII,赋值语句执行后ch的值为14,对应ASCII中的一个控制字符,不可显示。

因此,这道题目的四个选项都对。

3. 另一个题目

今天又看到一个题目,截图如下:

图片

这道题是判断哪一个选项不是合法的常量。给出的答案是D,但按照本文所讲,D选项也是一个正确的常量。因此,该题又是一个错误的题目。

参考文献:

[1]李红卫,李秉璋. C程序设计与训练(第四版)[M],大连,大连理工大学出版社,2023.

[2]https://pan.baidu.com/s/17ZXphwqySNIsIgcGtYMjvg?pwd=lhwc

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhw---9999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值