《C和指针》学习笔记[第三章 数据]
1.
int main(void) { printf("SCHAR_MIN %d\n", SCHAR_MIN); printf("SCHAR_MAX %d\n", SCHAR_MAX); printf("UCHAR_MAX %d\n\n", UCHAR_MAX); printf("SHRT_MIN %d\n", SHRT_MIN); printf("SHRT_MAX %d\n", SHRT_MAX); printf("USHRT_MAX %d\n\n", USHRT_MAX); printf("INT_MIN %d\n", INT_MIN); printf("INT_MAX %d\n", INT_MAX); printf("UINT_MAX %d\n\n", UINT_MAX); printf("LONG_MIN %ld\n", LONG_MIN); printf("LONG_MAX %ld\n", LONG_MAX); printf("ULONG_MAX %lud\n\n", ULONG_MAX); printf("LLONG_MIN %lld\n", LLONG_MIN); printf("LLONG_MAX %lld\n", LLONG_MAX); printf("ULLONG_MAX %llud\n\n", ULLONG_MAX); return EXIT_SUCCESS; }
SCHAR_MIN -128 SCHAR_MAX 127 UCHAR_MAX 255 SHRT_MIN -32768 SHRT_MAX 32767 USHRT_MAX 65535 INT_MIN -2147483648 INT_MAX 2147483647 UINT_MAX -1 LONG_MIN -9223372036854775808 LONG_MAX 9223372036854775807 ULONG_MAX 18446744073709551615d LLONG_MIN -9223372036854775808 LLONG_MAX 9223372036854775807 ULLONG_MAX 18446744073709551615d
2.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <float.h> #include "t_c.h" int main(void) { printf("FLT_MIN %g\n", FLT_MIN); printf("FLT_MAX %g\n\n", FLT_MAX); printf("DBL_MIN %g\n", DBL_MIN); printf("DBL_MAX %g\n\n", DBL_MAX); printf("LDBL_MIN %Lg\n", LDBL_MIN); printf("LDBL_MAX %Lg\n\n", LDBL_MAX); return EXIT_SUCCESS; }
FLT_MIN 1.17549e-38 FLT_MAX 3.40282e+38 DBL_MIN 2.22507e-308 DBL_MAX 1.79769e+308 LDBL_MIN 3.3621e-4932 LDBL_MAX 1.18973e+4932
3.[看了答案]
通过typtedef 创建类型的别名
在32位机器上创建
typedef signed char int8; typedef short int int16; typedef int int32; typedef int defint8; typedef int defint16; typedef int defint32;
在16位机器上创建
typedef signed char int8; typedef int int16; typedef long int int32; typedef int defint8; typedef int defint16; typedef long int defint32;
4.
int main(void) { long n = 32; short m; m = n; printf("%d\n", m); return EXIT_SUCCESS; }
当long的变量没有超过short的最大值或最小值的时候,正确。否则错误
我的编译器没有任何提示
5.
int main(void) { double n = 3.14; float m; m = n; printf("%g\n", m); return EXIT_SUCCESS; }
没有任何提示,在float范围内正确
int main(void) { double n = 3.14159265357e33; float m; m = n; printf("%lf\n", n); printf("%f\n", m); return EXIT_SUCCESS; }
3141592653570000260842979827122176.000000 3141592547701797897012520417230848.000000
出现了精度差
6.
int main(void) { typedef enum {PENNY=1,NICKLE=5,DIME=10,QUARTER=25} money; money pp; pp = QUARTER; printf("penny %d\n", PENNY); printf("pp %d\n", pp); return EXIT_SUCCESS; }
7.
32
48
8.
int main(void) { char *string = "hello world"; string[0] = 'H'; printf("%s\n", string); return EXIT_SUCCESS; }
默认不行报错
Bus error: 10
cc -fwritable-strings t_c.c ;./a.out
这样可以
9.
signed主要是用来给char用的,因为不同的系统的char的默认类型可能为 unsigned char或signed char,对于一些编译器对于默认的char int等
不确定具体类型的,加上这个,可以明确。
10.
这个问题可能翻译的不是很好。容纳的数字的数量是一样的,因为bit位是一样的,但无符号的理解,可以表示更大的数字。
11.[抄答案]
float的范围比int大,但如何它的尾数不比int更多,它并不能比int表示更多不同的值。前一个问题的答案已经提示了它们应该能够表示的不同值的数量是相同,但在绝大数浮点系统中...
12.
我觉的功能是一样的,一个分开写,一个写在一起。第一个定义了a并赋值,第二个先定义a,后赋值。
13.
那第二个就无法进行赋值,因为const声明之后为常量,不可修改值的内容。
14.
是错的,就算定义了static为静态变量,但也能改变该变量的作用域范围。
15.
这是错的,函数a申请的自动变量,只能在函数a中范围,exter int x 能访问外部的全局变量。
16.
不会,改成静态变量,不会修改变量的作用域范围。
17.
不需要
18.
不需要
19.
需要声明extern int num;
20.
会的,添加了static,该变量只能在本源文件的函数中能够读取,修改.
21.
有可能,但不应该指望它。应该只不过是可能
22.
代码块内部是局部变量,只能变量在栈区,只能在内部共享,使用。在代码块外部,属于全局变量[书中叫文件作用域],所有的源文件都可以读取该变量。
23.[网上查找,主要被第一个a搞了一票,卡住了,只要将a定义y后面即可]
#include<stdio.h> static char b = 2; void y( void ) { } int a = 1; void x( void ) { int c = 3; static float d = 4; } int main(int argc, char *argv[]) { return 0; }
24.
可以编译通过的
static int w = 5; extern int x; static int y = 10; static float func1(int a, int b, int c) { int d, e = 1; { int d, e, w; { int b, c, d; static int y =2; printf("b = %d\n", b); } } { register int a, d, x; extern int y; printf("y = %d\n", y); } return 0; } //static int y; 放这里,因为前面函数申请需要读取全局变量y,在后面申请全局变量y,说明文件作用域有两个全局的y不行。 float func2(int a) { extern int y; static int z; return 0; }