小问题

例一:

下面程序输出什么?

int main()  
{  
    int i = 43;  
    int n = printf("%d\n",i);
    printf("%d\n",n);     
    return 0;
} 

国嵌唐老师(22134670):

大家深入考虑一下 为什么返回是3 这背后有什么鲜为人知的秘密 到底是C语言离奇的规定 还是深思熟虑后的决定?
相信大家都在学习国嵌的嵌入式课程 在学习驱动的时候  应该知道有一种字符设备驱动,在linux 中一切东东都是文件 外设也是文件 也就是说显示器也是文件 那么printf的实现其实就是调用显示器的驱动程序往这种外设写入数据  所以我们来考虑一下  显示器属于什么设备呢 字符型设备 所以printf返回的其实不应该是输出的字符个数 准确的说应该是 向字符设备写入的数据的字节数  因为char就占用一个字节 所以碰巧 “printf返回输出字符的个数” 这个说法正确了。


例二:

有两个疑问:

第一个:#define中 用到了array, 但是array在后面才定义的,合法吗?为什么?
第二个:程序输出什么?

#include <stdio.h> 
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) 
int array[] = {23,34,12,17,204,99,16}; 
int main() 
{
    int d;
    for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
        printf("%d\n",array[d+1]);
    return 0; 
} 
第一个:#define中 用到了array, 但是array在后面才定义的,合法吗?为什么?
其实合法的,在编译之前是预编译,预编译会处理#define之流的东东,在编译时这个define就没了。


第二个:程序输出什么?
程序不会输出任何东西。因为int和unsigned int比较时会被转换为无符号的,因此-1就直接被看成0xFFFFFFFF了,这样d不可能小于条件中的表达式。自然for不会执行。注意一点sizeof是编译的工具,它的计算结果是无符号的。



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值