先来搞清楚字符串长度和字符串占用内存字节的区别:
《C和指针》第九章<字符串,字符和字节>175页中,作者Kenneth A Reek说:NULL字符是字符串的中止符,但它本身并不是字符串的一部分,所以字符串的长度并不包括NULL字节。所以字符串长度所表示的字节数加上一,才等于该字符串所占用的字节数.
我认为关键在于编译器怎么翻译while(*t++)这句代码
首先,运算符*和++具有相同的优先级段,但是由于他们是从右向左结合的,所以该句代码实际上是:*(t++),即先执行t++,但是又因为运算符++是"后计算",所以这句代码执行用汉语来说大概就是:先取指针t指向的字符,然后t指向下一个字符.
我用keil mdk编译器做了测试,while(*t++)这句代码翻译成汇编代码如下所示:
//while(*t++);
NOP
LDRB r3,[r2],#0x01
CMP r3,#0x00
BNE 0x000001A2
即先将寄存器r2中值所在的地址的数据放到寄存器r3中,然后r2的值加1,然后比较r3和0是否相等,在keil mdk编译器下测试字符串"123",返回值为4,也就是C选项是对的
但是,keil mdk对应的是ARM架构处理器,不排除在PC中编译器将while(*t++)成别的
希望你自己在PC上也做一下测试
相信你自己,不管是不是选C,我想你对指针和字符串操作都有了新的认识了,这已经是非常好的答案了.