user-0 提问: 这个程序为什么输出的是5和s啊？脑子混乱了？

回复:
user: user-1
content: s是因为要截取，5不知道啊

user: user-2
content: 引用 2 楼 czarten 的回复:问题太多了 首先注意单引号和双引号 其次a应该是char不是int 而且字符串赋值不能这么写  #include<stdio.h> #include<string.h> int main() {     char a[100]="aasdfgdfsadfa见s";     printf("%d\n",strlen(a));     printf("%c",a[0]);     return 0; } +1

user: user-3
content: 你直接看汇编自己跟踪吧，就知道为什么了。

user: user-4
content: 你这是在创造语法

user: user-5
content: 引用 3 楼 u012495471 的回复:我知道应该定成字符型，我是故意把数组定义成整型，我想知道为什么定义成整型结果是这样的？我想知道这其中的真相？类型的存储大小不一样，int型一般为4字节，而char一般为1字节

user: user-6
content: 包含两个重大问题： 1、a[0]='aasdfgdfsadfa见s'不符合逻辑的写法，要么改为：    int a[100] = "aasdfgdfsadfa见s";    要么改为：a[0] = 'a' 2、字符串以'\0'结尾，你的程序中没有显式的定义它，所以结果难料，    刚好你的环境是第六个元素为0，所以strlen计算为5，    其它机器和环境可能是另外的值   引用 楼主 u012495471 的回复:#include<stdio.h> #include<string.h> int main() {     int a[100],i;     a[0]='aasdfgdfsadfa见s';     printf("%d\n",strlen(a));     printf("%c",a[0]);     return 0;  }

user: user-7
content: char字符型是8位的，int是32位的，也就是4个字符顶一个int，你这个复制之后就是这样的 a[0]='aasd' a[1]=fgdf a[2]=sadf a[3]=a见s a[4]=/0就是结束字符；所以 数组长度5， 再把int转为char，可能是因为存储方式，a[0]存储方式为aa ds，所以取到的是s

user: user-8
content: 我只想告诉你，'1'的ASCII码为0x31 那么 '11'就代表着 0x3131

user: user-9
content: 那个a[0]定义的问题很大，int和char通过ascii码转化。

user: user-10
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-11
content: 其他实现方式，包括编译出错，不能编译通过。 假设对于某个C,C++编译器；  该程序能够编译通过， 那么a[0]， 只能实际接受一个字符.  至于哪个字符被接受， 看编译器如何实现（比如大小端），以及编译器采用的编码，和编辑器采用的编码。

user: user-11
content: 引用 12 楼 u012495471 的回复:虽然我还是没弄懂，还是感谢你们的解答。看来想了解程序运行的本质，非学汇编不可。至于其中一位哥们儿嘲笑我是在创造语法，我想打个比喻：小时候妈妈叫我们不要玩刀子，听话的孩子没有玩刀子（所以他们没被刀子划伤，妈妈也表扬他是个听话的好孩子，但是他始终不知道为什么不能玩刀子，他们只知道这样做会被妈妈叫做好孩子），有些孩子没听，被刀子划伤了，他恍然大悟，原来妈妈不叫我玩刀子是因为玩刀子可能会划伤啊！有一天，有个没碰过刀子的孩子无聊，见妈妈不在家，和邻居家的一个小孩玩了他从来没碰过的刀子，，，，， 你要先知道，正确的做法，并且很熟练的使用， 然后再去研究，错误的，禁忌的做法为什么错误，错在哪里！ a[0]='aasdfgdfsadfa见s';这种跟具体的编译器的实现有关。 其中一种实现方式，是  a[0]='aasdfgdfsadfa见s' <==> a[0] ='s'; 由于这个数组在栈上，数组a 并没有初始化。 其中存储的值，是程序运行到此处，堆栈上，该位置，某次使用后的残值。  这样，只有a[0] =='s'; 是确定的； 数组中其他99个数据，无从确定是什么值。 a[5]恰巧是0，也不是什么奇怪的事情。 于是strlen(a) =5 ,a[]0]='s' 就是一种很平常的偶然，一种很平常的巧合了。

user: user-0
content: 虽然我还是没弄懂，还是感谢你们的解答。看来想了解程序运行的本质，非学汇编不可。至于其中一位哥们儿嘲笑我是在创造语法，我想打个比喻：小时候妈妈叫我们不要玩刀子，听话的孩子没有玩刀子（所以他们没被刀子划伤，妈妈也表扬他是个听话的好孩子，但是他始终不知道为什么不能玩刀子，他们只知道这样做会被妈妈叫做好孩子），有些孩子没听，被刀子划伤了，他恍然大悟，原来妈妈不叫我玩刀子是因为玩刀子可能会划伤啊！有一天，有个没碰过刀子的孩子无聊，见妈妈不在家，和邻居家的一个小孩玩了他从来没碰过的刀子，，，，，

user: user-0
content: 我知道应该定成字符型，我是故意把数组定义成整型，我想知道为什么定义成整型结果是这样的？我想知道这其中的真相？

user: user-12
content: 问题太多了 首先注意单引号和双引号 其次a应该是char不是int 而且字符串赋值不能这么写  #include<stdio.h> #include<string.h> int main() {     char a[100]="aasdfgdfsadfa见s";     printf("%d\n",strlen(a));     printf("%c",a[0]);     return 0; }

user: user-13
content: a[0]是什么 'aasdfgdfsadfa见s'又是什么？ 它们的类型一致否？  strlen的参数需要是什么类型？