#include<stdio.h>
#include<stdlib.h>
int main( int argc ,char** argv) {
int bugs = 100;
char nul_byte='\0';
char care_percentage = bugs * nul_byte;
printf("Which means you should care %s%%.\n",care_percentage);// 1->prints (null)
printf("Which means you should care %d%%.\n",care_percentage);// 2->prints 0
printf("Which means you should care %c%%.\n",care_percentage);// 3->prints
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是在最后三个语句1,2和3中发生了什么.在机器级内部发生了什么.%s如何(null)和%d将其视为0,%c在打印时将其视为空.
有人可以在机器深度解释这些吗?
首先:这与"机器级别"无关.这里的一切都发生在运行时或更具体地说是在实现中printf().此外,通过使用错误的格式说明符发生的所有"转换"可能会找到麻烦,因为您无法保证这些实际上是正确传递/读取/解释(例如由于长度不同),如果您没有投射参数为格式说明符的正确类型.
首先计算:
bugs设置为100.nul_byte设置为0(实际值\0).care_percentage基本上解决了做100 * 0,这将0再次.那么,会发生什么?
第一种情况:这是一个特例,我不一定会依赖它这样做.你实际上是在访问存储在的字符串0x00000000(这是一个无效的位置;可怕的NULL指针),你很幸运它被抓住了(不要认为它实际上是定义了行为,但随意证明我错了).
第二种情况:传递的值被读作一个整数,因此它是0,因为这是实际值(想象一下(指针)强制转换).
第三种情况:传递的值被读作一个字符,这会触发一个特殊情况,因为它没有直接插入到字符串中\0.