2.C语言之数据类型
2013-10-23 09:41
190 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://kymsha.blog.51cto.com/647951/289689
1. C语言中的布尔类型
在C语言中,是没有布尔类型的,0就是false,非0就是true。
于是,写习惯了Java/C#的我们自然会很不习惯,这个时候,我们不妨用宏定义来使我们的代码看起来更舒服一些。
在C99中,长期缺乏布尔类型的问题得到的解决,但是在目前,C99标准还没有得到很好的推广。暂且不提。
2. limits.h
习惯了平台无关的我们,在学习C语言时,必须需要注意他的平台相关性。其中很典型的例子就是在不同的平台下,不同的编译器下,int的取值范围是不同的。
在C#中,我们可以用Int32.MaxValue来获得,那么在C语言中,我们该怎么获得呢?
在C中,提供了一个头文件limits.h,里面有很多宏定义。
那么我们就很容易得到int类型的取值范围。
3.
浮点类型
在C语言中,提供了三种浮点类型:分别为
float:单精度浮点数,
double:双精度浮点数,
long double:扩展精度浮点数。
在一般要求不严格的情况下,float就足够了,其次是double,long double几乎不会用到。
在C99中,浮点类型包括两种,分别为实浮点类型,就是我们上面提到的。还有复数类型,分别对应为float_Complex等等。
4. 字符类型
scanf:函数读取字符时,遇到换行,空格,tab就会停止,而字符剩余的部分继续留在缓冲区,这个时候如果再有scanf函数请求键盘输入的时候就会直接通过cin函数直接从缓冲区读取数据,而不会在请求键盘输入了.这个时候就会导致读取输入的内容并非我们需要的内容.
在C语言中,一般采用的ASCII编码,而字符类型又分为有符号型和无符号型。在C语言标准中,对此并无规定,因此是由不同的编译器自己决定。
因此考虑到可移植性,如果涉及到符号相关,我们不要假设char是有符号还是无符号,而用signed和unsigned来显式标识。
由于在C语言中,字符实际上是被作为整数来处理的,因此在C89中,将字符类型和整数类型统称为整值类型。
C语言读入字符不会跳过空白字符。我们可以看一个简单的例子:
我现在键入一个换行:
他也把换行符读入,然后打印出来。
那么我们如何读入一串字符串呢?
当然,我们也可以这样来写:
5. getchar和putchar
在C语言中,为我们提供了专门输入和输出字符的函数,也就是getchar()和putchar().
让我们看下getchar()和putchar()的定义。
_Check_return_ _CRTIMP int __cdecl getchar(void);
_Check_return_opt_ _CRTIMP int __cdecl putchar(_In_ int _Ch);
我们可以看到,其实他们返回的都是int类型的值。OK,让我们看看他们都返回什么。
我们可以看到,他们都是返回其字符的ASCII码。
那么,既然C语言为我们提供了这样专门的函数,一定说明他在读取和输出字符方法比scanf和printf有着特殊的优势。
A. 由于getchar和putchar函数实现比较简单,因此较之效率更高。
B. 为了额外的效率提升,通常getchar和putchar都是作为宏来实现的。
总之,他们相较之略显重量的scanf和printf效率更高。
另外,我们还可以用getchar来实现读取字符的C语言惯用法。
这样的函数一直读到换行终止。
另外:
我们也可以这样来实现忽略一切空白,当然也可以修改程序使之忽略其他字符。
另外,我们在前文说过,scanf在无法完成彻底模式匹配时,会把剩余的字符放到缓冲区,供下次读取。那么我们来看这样一段代码:
由此可知,getchar()也会首先打缓冲区里去读取字符。
------------------
| 【总结】 |
------------------
第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
这个函数是fflush(stdin)。
方法2:自己取出缓冲区里的残留数据。
(说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)
scanf("%[^\n]",string);
1. C语言中的布尔类型
在C语言中,是没有布尔类型的,0就是false,非0就是true。
于是,写习惯了Java/C#的我们自然会很不习惯,这个时候,我们不妨用宏定义来使我们的代码看起来更舒服一些。
#define BOOL int #define TRUE 1 #define FALSE 0 int main (void) { BOOL flag=TRUE; if(flag) { printf("true"); } else { printf("false"); } }
在C99中,长期缺乏布尔类型的问题得到的解决,但是在目前,C99标准还没有得到很好的推广。暂且不提。
2. limits.h
习惯了平台无关的我们,在学习C语言时,必须需要注意他的平台相关性。其中很典型的例子就是在不同的平台下,不同的编译器下,int的取值范围是不同的。
在C#中,我们可以用Int32.MaxValue来获得,那么在C语言中,我们该怎么获得呢?
在C中,提供了一个头文件limits.h,里面有很多宏定义。
那么我们就很容易得到int类型的取值范围。
#include <stdio.h> #include <stdlib.h> #include <limits.h> int main (void) { printf("int的最小值是:%d;最大值是:%d",INT_MIN,INT_MAX); return 0; }
3.
浮点类型
在C语言中,提供了三种浮点类型:分别为
float:单精度浮点数,
double:双精度浮点数,
long double:扩展精度浮点数。
在一般要求不严格的情况下,float就足够了,其次是double,long double几乎不会用到。
在C99中,浮点类型包括两种,分别为实浮点类型,就是我们上面提到的。还有复数类型,分别对应为float_Complex等等。
4. 字符类型
scanf:函数读取字符时,遇到换行,空格,tab就会停止,而字符剩余的部分继续留在缓冲区,这个时候如果再有scanf函数请求键盘输入的时候就会直接通过cin函数直接从缓冲区读取数据,而不会在请求键盘输入了.这个时候就会导致读取输入的内容并非我们需要的内容.
在C语言中,一般采用的ASCII编码,而字符类型又分为有符号型和无符号型。在C语言标准中,对此并无规定,因此是由不同的编译器自己决定。
因此考虑到可移植性,如果涉及到符号相关,我们不要假设char是有符号还是无符号,而用signed和unsigned来显式标识。
由于在C语言中,字符实际上是被作为整数来处理的,因此在C89中,将字符类型和整数类型统称为整值类型。
C语言读入字符不会跳过空白字符。我们可以看一个简单的例子:
int main (void) { char ch; scanf("%c",&ch); printf("%c",ch); return 0; }
我现在键入一个换行:
他也把换行符读入,然后打印出来。
那么我们如何读入一串字符串呢?
int main (void) { char ch='a'; int count=0; do { scanf("%c",&ch); count++; }while(ch!='\n'); printf("%d",count-1); }
当然,我们也可以这样来写:
int main (void) { char ch='a'; int count=0; scanf("%c",&ch); while(ch!='\n') { count++; scanf("%c",&ch); } printf("%d",count); }
5. getchar和putchar
在C语言中,为我们提供了专门输入和输出字符的函数,也就是getchar()和putchar().
让我们看下getchar()和putchar()的定义。
_Check_return_ _CRTIMP int __cdecl getchar(void);
_Check_return_opt_ _CRTIMP int __cdecl putchar(_In_ int _Ch);
我们可以看到,其实他们返回的都是int类型的值。OK,让我们看看他们都返回什么。
int main (void) { char c; int result; c=getchar(); result = putchar(c); printf("\nc:%c;result:%d",c,result); }
我们可以看到,他们都是返回其字符的ASCII码。
那么,既然C语言为我们提供了这样专门的函数,一定说明他在读取和输出字符方法比scanf和printf有着特殊的优势。
A. 由于getchar和putchar函数实现比较简单,因此较之效率更高。
B. 为了额外的效率提升,通常getchar和putchar都是作为宏来实现的。
总之,他们相较之略显重量的scanf和printf效率更高。
另外,我们还可以用getchar来实现读取字符的C语言惯用法。
int main (void) { while(getchar()!='\n'); return 0; }
这样的函数一直读到换行终止。
另外:
int main (void) { char c; while((c=getchar())==' '); switch(c) { case 'a': printf("a"); break; case 'q': printf("q"); break; default: printf("others"); break; } }
我们也可以这样来实现忽略一切空白,当然也可以修改程序使之忽略其他字符。
另外,我们在前文说过,scanf在无法完成彻底模式匹配时,会把剩余的字符放到缓冲区,供下次读取。那么我们来看这样一段代码:
int main (void) { int i ; char c; scanf("%d",&i); c=getchar(); printf("%c",c); }
由此可知,getchar()也会首先打缓冲区里去读取字符。
------------------
| 【总结】 |
------------------
第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
这个函数是fflush(stdin)。
方法2:自己取出缓冲区里的残留数据。
(说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)
scanf("%[^\n]",string);
相关文章推荐
- C语言中time_t数据类型详细介绍
- 在C语言中,double、long、unsigned、int、char类型数据所占字节数
- C语言中各种基本数据类型在内存中的存储方式
- 在C语言中,double、long、unsigned、int、char类型数据所占字节数
- (二)、C语言的基本数据类型
- C语言 第二讲 数据类型
- C语言数据类型
- C语言之基本数据类型(笔记二)
- C语言enum(枚举)数据类型
- C语言中不同数据类型间混合运算的转换规则
- C语言数据类型-指针类型和空类型
- C语言学习笔记之基本数据类型
- (C语言教程)第二章: 数据类型、运算符、表达式
- 28 大话C语言变量和数据类型
- C语言数据类型转换
- C语言中各数据类型表示范围
- C语言之数据类型
- GTK中的数据类型与C语言的数据类型
- C语言各种数据类型在系统中占的字节和取值范围
- C语言几种常见数据类型的范围