user-0 提问: C语言:合法的长整型常数

回复:
user: user-0
content: 引用 36 楼 XinYaping 的回复:[quote=引用 10 楼 liu15073458538 的回复:] [quote=引用 9 楼 wang0635 的回复:] [quote=引用 8 楼 liu15073458538 的回复:] [quote=引用 4 楼 fefe82 的回复:] [quote=引用 2 楼 user-8 的回复:] 长整型说的应该是long   而A 是char  B const char*  C int  D什么也不是  所以都不是 在 C 语言里， 't' 是 int 。C++ 语言里，'t' 是 char 。[/quote] 是啊  A，C都是int 为什么选A？[/quote] 没有为什么，都是错的，题目出错了[/quote] 哦哦  明白了 谢谢[/quote]  其实题目并没有出错。只是，这道题目背后的深意，好多人可能注意不到。 请看我在 32、34 楼的回复。  最早出这道题的人，他要强调的东西，其实是有意义的。只是后来的人只不过把题库 copy 过来，未必真的领会原作者的意思。 [/quote] 我好笨，还是没明白这个题目的深意~~唉~~

user: user-1
content: 解释：  A) 't'   // int，可转换为 long const B) "A" // char [2] C) 65 // 数字常量后需要加L来显式定义为长整型常量，定义格式不对，不会被解析为 long const D) A  //  标识符

user: user-1
content: 'A'，65L

user: user-2
content: 引用 38 楼 DelphiGuy 的回复:JSF是开发f-35的项目，与f-22无关，f-22的软件是用Ada+小部分汇编开发的，不是C++。就是f-35的软件，53%的代码是C，C++代码只占35%，其余是汇编和Ada。  Sir, thank you for the clarification!

user: user-3
content: JSF是开发f-35的项目，与f-22无关，f-22的软件是用Ada+小部分汇编开发的，不是C++。就是f-35的软件，53%的代码是C，C++代码只占35%，其余是汇编和Ada。

user: user-4
content: 孩子，只要知道数据的长度和存储方式就行了，只有大学里的老师才会出这样的题目

user: user-2
content: 引用 10 楼 liu15073458538 的回复:[quote=引用 9 楼 wang0635 的回复:] [quote=引用 8 楼 liu15073458538 的回复:] [quote=引用 4 楼 fefe82 的回复:] [quote=引用 2 楼 user-8 的回复:] 长整型说的应该是long   而A 是char  B const char*  C int  D什么也不是  所以都不是 在 C 语言里， 't' 是 int 。C++ 语言里，'t' 是 char 。[/quote] 是啊  A，C都是int 为什么选A？[/quote] 没有为什么，都是错的，题目出错了[/quote] 哦哦  明白了 谢谢[/quote]  其实题目并没有出错。只是，这道题目背后的深意，好多人可能注意不到。 请看我在 32、34 楼的回复。  最早出这道题的人，他要强调的东西，其实是有意义的。只是后来的人只不过把题库 copy 过来，未必真的领会原作者的意思。

user: user-5
content: 引用 33 楼 XinYaping 的回复:[quote=引用 25 楼 zhao4zhong1 的回复:] C++ Integer Constants Integer constants are constant data elements that have no fractional parts or exponents. They always begin with a digit. You can specify integer constants in decimal, octal, or hexadecimal form. They can specify signed or unsigned types and long or short types.  Syntax  ......  赵老师看看我上一楼的回复。 [/quote] 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-2
content: 附：  LDRA工具包——联合攻击战机（JSF）Air Vehicle C＋＋编程规范的选择 http://www.visionmc.com/company/news06/s060322.html  JSF AV C++ http://www.programmingresearch.com/coding-standards/jsf-av-c/  JSF++ AV (Joint Strike Fighter - Aircraft Air Vehicle) http://www.indes.com/embedded/en/products/319_JSF___AV__Joint_Strike_Fighter_-__Aircraft_Air_Vehicle_/

user: user-2
content: 引用 25 楼 zhao4zhong1 的回复:C++ Integer Constants Integer constants are constant data elements that have no fractional parts or exponents. They always begin with a digit. You can specify integer constants in decimal, octal, or hexadecimal form. They can specify signed or unsigned types and long or short types.  Syntax  ......  赵老师看看我上一楼的回复。

user: user-2
content: 引用 30 楼 ipqtjmqj 的回复:[quote=引用 29 楼 XinYaping 的回复:] [quote=引用 27 楼 ipqtjmqj 的回复:] [quote=引用 26 楼 XinYaping 的回复:] [quote=引用 22 楼 ipqtjmqj 的回复:] [quote=引用 19 楼 XinYaping 的回复:] 你可以说这道题出得很无聊。但是就事论事地说，答案确实是 A。 A也不对，字符常量的类型为int[/quote]  你实际编程看看 A 对不对。[/quote] 实际只能知道size,怎么输出type？[/quote]  我的意思是说你实际地写程序，给整型常量按照 A 来初始化，然后看看编译器给不给 Warning。  const long X = 't';[/quote] 给不给与编译器设置有关，就按你说的， 我写了两句const long x = 't'; const long y = 65; 都没给，按你的逻辑，应该有两个答案[/quote]   其实，这道题确实是一道很无聊的题。但是，题目它已经就这样了。我说点不那么无聊的事情吧。  首先，你说得对，无论是 const long x = 't'; 还是 const long y = 65; 编译器都不会给 Warning。 这也是我预料之中的事情。  不过呢，小弟我半年前作过一个航空机载电子设备的项目，在那个项目中，我们执行一个比较严苛的 C++ 代码检查标准。我们是通过 LDRA 软件，以洛克希德-马丁公司公布出来的一个标准：JSF++ AV Coding Standard 好像是 开发 F-22、F-35战机的时候用的一个 C++ 代码静态分析检查清单，以此来执行代码审核的条件之一。  按照那个军用航空航天标准，比如说 const long x = 65; 这一句在代码审查中肯定就通过不了。为什么呢？因为，标准要求，类似于 long 这样的数据类型，都不能用，而要改为 uint32、uint64 这样的明确表明数据长度的类型。65 既然是用来初始化一个长整型，那么不能直接写 65 而要写成 65L 这样，就应该写成：const uint64 x = 65L; 还有，比如以下这一句： const uint8 y = 0; 这一句也过不了代码审查，要写成这样： const uint8 y = 0U;  类似的规则还有很多，在通常情况下无所谓的一些情况，在我们那个项目中却要返工重写，必须通过这个标准才能通过审查。  补充这样一些信息给你，可能也对你没什么用，权当闲聊吧。

user: user-6
content: 第10条明确说字符常量是int类型

user: user-6
content: 引用 29 楼 XinYaping 的回复:[quote=引用 27 楼 ipqtjmqj 的回复:] [quote=引用 26 楼 XinYaping 的回复:] [quote=引用 22 楼 ipqtjmqj 的回复:] [quote=引用 19 楼 XinYaping 的回复:] 你可以说这道题出得很无聊。但是就事论事地说，答案确实是 A。 A也不对，字符常量的类型为int[/quote]  你实际编程看看 A 对不对。[/quote] 实际只能知道size,怎么输出type？[/quote]  我的意思是说你实际地写程序，给整型常量按照 A 来初始化，然后看看编译器给不给 Warning。  const long X = 't';[/quote] 给不给与编译器设置有关，就按你说的， 我写了两句const long x = 't'; const long y = 65; 都没给，按你的逻辑，应该有两个答案

user: user-2
content: 引用 27 楼 ipqtjmqj 的回复:[quote=引用 26 楼 XinYaping 的回复:] [quote=引用 22 楼 ipqtjmqj 的回复:] [quote=引用 19 楼 XinYaping 的回复:] 你可以说这道题出得很无聊。但是就事论事地说，答案确实是 A。 A也不对，字符常量的类型为int[/quote]  你实际编程看看 A 对不对。[/quote] 实际只能知道size,怎么输出type？[/quote]  我的意思是说你实际地写程序，给整型常量按照 A 来初始化，然后看看编译器给不给 Warning。  const long X = 't';

user: user-7
content: 引用 27 楼 ipqtjmqj 的回复:[quote=引用 26 楼 XinYaping 的回复:] [quote=引用 22 楼 ipqtjmqj 的回复:] [quote=引用 19 楼 XinYaping 的回复:] 你可以说这道题出得很无聊。但是就事论事地说，答案确实是 A。 A也不对，字符常量的类型为int[/quote]  你实际编程看看 A 对不对。[/quote] 实际只能知道size,怎么输出type？[/quote]  可以看看这个  需要 C11

user: user-6
content: 引用 26 楼 XinYaping 的回复:[quote=引用 22 楼 ipqtjmqj 的回复:] [quote=引用 19 楼 XinYaping 的回复:] 你可以说这道题出得很无聊。但是就事论事地说，答案确实是 A。 A也不对，字符常量的类型为int[/quote]  你实际编程看看 A 对不对。[/quote] 实际只能知道size,怎么输出type？

user: user-2
content: 引用 22 楼 ipqtjmqj 的回复:[quote=引用 19 楼 XinYaping 的回复:] 你可以说这道题出得很无聊。但是就事论事地说，答案确实是 A。 A也不对，字符常量的类型为int[/quote]  你实际编程看看 A 对不对。

user: user-5
content: C++ Integer Constants Integer constants are constant data elements that have no fractional parts or exponents. They always begin with a digit. You can specify integer constants in decimal, octal, or hexadecimal form. They can specify signed or unsigned types and long or short types.  Syntax  integer-constant :  decimal-constant integer-suffixopt octal-constant integer-suffixopt hexadecimal-constant integer-suffixopt 'c-char-sequence'  decimal-constant :  nonzero-digit decimal-constant digit  octal-constant :  0 octal-constant octal-digit  hexadecimal-constant :  0x hexadecimal-digit 0X hexadecimal-digit hexadecimal-constant hexadecimal-digit  nonzero-digit : one of  1 2 3 4 5 6 7 8 9  octal-digit : one of  0 1 2 3 4 5 6 7  hexadecimal-digit : one of  0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F  integer-suffix :  unsigned-suffix long-suffixopt long-suffix unsigned-suffixopt  unsigned-suffix : one of  u U  long-suffix : one of  l L  64-bit integer-suffix :  i64  To specify integer constants using octal or hexadecimal notation, use a prefix that denotes the base. To specify an integer constant of a given integral type, use a suffix that denotes the type.  To specify a decimal constant, begin the specification with a nonzero digit. For example:  int i = 157;   // Decimal constant int j = 0198;  // Not a decimal number; erroneous octal constant int k = 0365;  // Leading zero specifies octal constant, not decimal  To specify an octal constant, begin the specification with 0, followed by a sequence of digits in the range 0 through 7. The digits 8 and 9 are errors in specifying an octal constant. For example:  int i = 0377;   // Octal constant int j = 0397;   // Error: 9 is not an octal digit  To specify a hexadecimal constant, begin the specification with 0x or 0X (the case of the “x” does not matter), followed by a sequence of digits in the range 0 through 9 and a (or A) through f (or F). Hexadecimal digits a (or A) through f (or F) represent values in the range 10 through 15. For example:  int i = 0x3fff;   // Hexadecimal constant int j = 0X3FFF;   // Equal to i  To specify an unsigned type, use either the u or U suffix. To specify a long type, use either the l or L suffix. For example:  unsigned uVal = 328u;             // Unsigned value long lVal = 0x7FFFFFL;            // Long value specified                                    //  as hex constant unsigned long ulVal = 0776745ul;  // Unsigned long value

user: user-8
content: 引用 23 楼 fefe82 的回复:[quote=引用 4 楼 fefe82 的回复:] [quote=引用 2 楼 user-8 的回复:] 长整型说的应该是long   而A 是char  B const char*  C int  D什么也不是  所以都不是 在 C 语言里， 't' 是 int 。C++ 语言里，'t' 是 char 。[/quote] 对了，B 是 char[2] （C++ 里是 const char[2] ）[/quote]  对

user: user-7
content: 引用 4 楼 fefe82 的回复:[quote=引用 2 楼 user-8 的回复:] 长整型说的应该是long   而A 是char  B const char*  C int  D什么也不是  所以都不是 在 C 语言里， 't' 是 int 。C++ 语言里，'t' 是 char 。[/quote] 对了，B 是 char[2] （C++ 里是 const char[2] ）