自问自答学c语言(2)

问题11c语言的基本类型?
数字: 整数和小数 int 和float; int 有short int long int; float有double
字符: char
逻辑: bool
一个整体: struct, union, enum, 数组[]
操作底层的:指针,void

问题12不同数据类型,空间大小的问题?

sizeof(int) sizeof(float) sizeof(double)sizeof(struct my), 这些根据不同的编译环境一般不同,大体上是
int:4; float 4:   short int就为2, double就为8;long 也为4; 还有就是struct的字节对齐的问题影响sizeof;看一下mystru2和mystru3的区别sizeof一个是8一个是12
/*COPYRIGHT  drbinzhao@hotmail.com*/
#include <stdio.h>
struct myStru
{
    char a;
    char b;
    int  c;
};
struct myStru2
{
    char a;
    char b;
    char d;
    int  c;
};
struct myStru3
{
    char a;
    char b;
    int  c;
    char d;
};
int main()
{

//copyright  drbinzhao@hotmail.com
    printf("sizeof(short int)is %d\n",sizeof(short int));
    printf("sizeof(long int)is %d\n",sizeof(long int));
    printf("sizeof(int) is%d\n",sizeof(int));
    printf("sizeof(float) is%d\n",sizeof(float));
    printf("sizeof(double) is%d\n",sizeof(double));
    printf("sizeof(myStru) is%d\n",sizeof(myStru));
    printf("sizeof(myStru2) is%d\n",sizeof(myStru2));
    printf("sizeof(myStru3) is%d\n",sizeof(myStru3));
    char str[100];
    gets(str);
    printf("str is%s\n",str);
    printf("sizeof(%s) is%d\n",str,sizeof(str));
    return 0;
}

问题13sizeof是函数吗?
sizeof是运算符,不是函数; 是c语言中的关键字,同float,int,return一样;c++中的new也是关键字。

问题14ASCII码表
设计计算机时,以英文为语言;只要可以输入基本常用的字符共127个就可以了,于是2的7次方为
16*16/2=128 , 而16*16=(16+6)*10+6*6=220+36=256速算,速算法参我的另一博客文章
而64*64=64*66-128=4224-128=4096
因此一个byte表示所有的127个基本字符,其中高位全置为0.

问题15unsigned char 和signedchar的范围
signed char: 非负数 第八位为0其它全为1; 即0111 1111 大小为2的7次方-1=127因此范围0-127
                         负数 第八位为1其它为1: 即11111111大小为-1;1000 0000 大小为-128
unisigned char: 0-1111 1111 大小为2的8次方-1=255;
可以这样记忆:
先记忆无符号的8位,范围在2的8次方-1=255 0-255; 符号的范围最小为-2的八次方/2=-128, 最大由于正数里面多了个0,因此到127即 -128-127

问题16 scanf printf参数写的是变量名字还是变量地址?
printf("variable a is %d",a);
scanf("%d",&a);
设置时为了方便从stdin输入的东西直接放入变量的地址里就可以了,不必在通过变量寻址存放,因此scanf会设计成直接写入地址。
printf是打印的变量的数据和地址无关,因此这样设计。
我经常犯的毛病是写成scanf("%d",a)了。其次是scanf的输入格式的问题

scanf(“%d  %d”,&a,&b)两个空格隔开的则应该输入两个空格

scanf(“a=%d,b=%d”,&a,&b);


问题17没有计算器写个2进制,10进制的转换.

编译器在printf中看到%会认为和后面组成 输出格式, 那就有个问题,我就想输出%d怎么办?

#include <stdio.h>

int main()

{

//copyright  drbinzhao@hotmail.com

    signed int i = -1;

    signed int j =0xFFFFFFFF;

    printf("i is %d,%x\n",i,i);

    printf("j is%d,%x\n",j,j);

    printf("%%d");

    return 0;

}

还有我一直认为-1是1000 0000其实是1111 1111,因为-1是负数的最大。

 

问题18输出单个字符,我必须用printf(“%c”,c);吗?

不必,可以下列代码putchar

 

#include <stdio.h>

int main()

{

         // copyright  drbinzhao@hotmail.com

    char c='bc1';//此处int截断为char

    char d='b';

    putchar(c);

    putchar('\n');

    putchar(d);

    return 0;

}
                     
问题19scanf语句调用后,我不按回车,是否可以无穷尽的输入字符?

显然是不会的,否则和永动机没区别了,实际上用户利用键盘输入时,输入的字符会依次被送到缓冲区中,在此处等待的输入函数只有在用户输入了回车时,才会去缓冲区中取字符。接下来的输入函数也是先去缓冲区中查看当前是否存在字符。如果存在,则会取出字符;如果不存在,则会中断,提示用户输入

所以下面的代码才会有不合理的表现,加上fflush(stdin)后,第二个scanf显然在缓冲区查到不存在字符,因此中断,提示用户输入。一般缓冲区大小为4K

我们敲入的回车键也是作为一个字符送到缓冲区的。也被看成一个字符,和字符1没有什么区别,只是作为字符输入的结束符,当输完回车后,则所有输入的字符包括回车字符,一起被送入缓冲区,并执行此处等待的输入函数。

#include <stdio.h>

int main()

{

//copyright  drbinzhao@hotmail.com

    char a,b;

    printf("pleaseinput a and b as the format: a=123\n");

   scanf("a=%c",&a);

    //fflush(stdin);

   scanf("b=%c",&b);

   printf("a=%c,b=%c",a,b);

    return 0;

}

问题20:运算符的优先级是什么?

想到最基础的运算符+-*/%,需要2个操作数,叫做双目运算符;

相应还有单目的,三目的;

单目的有: 自减,自加;* & !还有 (int) (double)类型转换,还有一个是sizeof

三目的有:?:, 常用在a>=b?a:b

还有移位,逻辑,关系,赋值运算符。 

速记如下: 单目的肯定高了;

处长想当局长了(移位运算符<<>>),于是去找关系跑官(< ><= >= == !=),这种思维很符合现代中国人的逻辑(&& ||), 但是局长推托说不符合条件(?:)不能安排,给你个副局长干干(副职->赋值= += *=)

移位》关系》逻辑》条件》赋值

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值