本来很明确的问题,不过LS有些回答有误,那么就回答一下好了...
相对而言,ch='5'+'9'是正确的表达式(但是语义基本上无实际意义,如果是-的话表示字符集中两个字符相差的位置)。'5'和'9'都是字符常量,相加的结果也是赋给char类型的变量ch,没有语法上的问题。通常采用的ASCII码C语言实现中,'5'对应值为53,'9'对应值为57,结果ch会被赋值为110对应的char变量,也就是'n'。
至于ch='5+9',语义上无意义(不是表示“一个”字符),语法上也有大问题(就'5+9'的单引号内的字符数而言;事实上这样溢出了一个char的表示范围,导致隐式转换越界的错误),不过编译器不一定会给出编译错误,而可能只给出警告。
原因是,C语言的字符字面量(单引号括起来的部分)是int存储的(C++中是const char),只是明确了“表示一个数”的含义。用单引号括起来的部分超过4个字符(32位)时则会被截断。(用双引号括起来的字符串字面量则会被明确地实现为一段连续的内存空间中的char变量,可以看作char数组。)
LS几个回答的一些错误:
错误1:关于字符字面量的问题,上面有说。
错误2:语言问题和字符集问题混为一谈。
语言和字符集是无关的。ASCII只是C语言实现中支持得比较好的字符集,也和其它MBCS(多字节字符集,例如中文常用的ANSI/GBK)兼容,所以广泛采用。
错误2.5:ASCII是ANSI发布的7位编码,对应有效数值范围一般为0~127,而不是0~255。一些西欧扩展字符集中用区间128~255的一些编码点表示原本不属于ASCII的字符。
错误3:C语言没有内建的byte型数据。
顺便:需要注意,char、signed char、unsigned char也不一定完全相同,和平台相关。
错误4:5+9既然在成对的单引号内,就不会被作为表达式(当然,如果能硬写出不符合这种判断的编译器来的话,可以无视这条)。
To niebo_bar :断言“语法错误”时,需要有根据。或者如 FeVeR银 试验运行结果(虽然运行结果是否“正常”的理解因人而异),否则就是在帮助误导他人。
====
[原创回答团]
参考资料:原创 + Dev-C++确认