所以我参加了嵌入式系统课程,我们正在使用C语言。 它是第二周,所以我们只是刷新我们的C代码内存。
这段代码是如何打印出数字6的?幕后发生了什么?
int main (void) {
char msg[] = "288_882_288";
int my_length = 0xFFFFFFFF;
my_length = strlen(msg+strlen(msg) /2);
printf("%d",my_length);//prints 6
fflush(stdout);
}
谢谢!
答案 0 :(得分:7)
那是因为:
strlen(msg) = strlen("288_882_288") = 11
strlen(msg) / 2 = 5 (floor value taken)
msg + strlen(msg) / 2 is the same as msg + 5 == &msg[5]
strlen(msg+strlen(msg) /2) = strlen(&msg[5]) = strlen("82_288") = 6
答案 1 :(得分:1)
此字符串文字" 288_882_288" (用于初始化数组)的函数strlen返回的大小等于11.
此表达式msg+strlen(msg) /2
产生的指针指向索引为5
的字符串文字(更确切地说是数组msg)的元素,因为11 / 2
等于5
。
因此,从索引5
开始的字符串文字部分的长度等于6
。
6 characters
_____
| |
char msg[] = "288_882_288";
^
|
msg + strlen( msg ) / 2
答案 2 :(得分:1)
参考
strlen(“288_882_288” + strlen(“288_882_288”) / 2)
版本,C中的字符串文字是数组类型的对象。与数组类型的任何其他对象一样,它衰减为指针类型,在这种情况下为char *
。指针运算可以通常的方式与指针一起使用。那么,
"288_882_288" + strlen("288_882_288") / 2
子表达式产生一个char *
指针,大约指向"288_882_288"
字符串的中间位置(位置5)。从该位置取另一个strlen
将产生该字符串剩余尾部的长度,在您的情况下恰好为6。