問題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 [email protected]*/
#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 [email protected]
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 [email protected]
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 [email protected]
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 [email protected]
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
還有移位,邏輯,關系,賦值運算符。
速記如下: 單目的肯定高了;
處長想當局長了(移位運算符<<>>),於是去找關系跑官(< ><= >= == !=),這種思維很符合現代中國人的邏輯(&& ||), 但是局長推托說不符合條件(?:)不能安排,給你個副局長干干(副職->賦值= += *=)
移位》關系》邏輯》條件》賦值
作者:drbinzhao的專欄