`
mycream
  • 浏览: 53892 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C细节注意

阅读更多

大一学习C时的学习笔记,放出来共享下,嘻嘻。不过当时使用的编译器是TC或者VC6.0,即使用的C标准是C90而非最新的C99标准,故和现在的编译结果有些许出入。当然学习以动手为主,照搬书上的知识是学不到任何东东的。本文仅供拓展自我使用。

C细节注意 (2008年2月13日整理)


1.scanf()中用%lf代表双精度数,用%f代表浮点数,这与printf()通用%f代表不同。

2.二维浮点数数组的输入一定要先声明一个变量,接着把值赋给这个变量,然后再将该变量值赋给数组。见如下代码:


#include <stdio.h>
main(){
  float a[2][3], x;
  int i, j;
  for(i = 0; i < 2; i++) {
    for (j = 0; j < 3; j++) {
      scanf("%f", x);
      a[i][j] = x;
    }
  }
}
 

3.整数在计算机中是准确表示的,可以用二进制数表示。当用八进制数表示时,第一位数字前必须加0(数字);用十六进制数时必须加0x;无符号整数的末尾必须加字母u或U;长整数的末尾必须加字母l或L。

4.auto, register 与 static, extern 内的比较:
(一) auto 和 register 型变量的初始化是在程序执行期间完成的;
static 和 extern 型变量的初始化是在编译期间完成的。
(二) static 和 extern 型变量只能用常数或常数表达式进行初始化;
auto 和 register 型变量除常数或常数表达式外还可用已初始化过的变量进行初始化。
  如:
int a = 3 + 2, b = 6, c = a + 1; 
static float x = 5.6 + 7.3, y = 0.7;
 
(三) auto 和 register 型变量若未初始化,其值是不定的;
static 和 extern 型变量若未初始化,其值为0;

5.算术运算符中,%只能对整形运算量施加运算。在计算两个整数的余数时,余数的符号与被除数相同。
 如:
3%(-2) = 1;
-3 % 2 = -1; 
3 % 2 = 1;
-3 % (-2) = -1;
 

6.二维数组传送地址给一维指针时注意在数组名前加*,否则可能出现运算错误。
如:
 
int a[3][4] = {...}, *p;
 p = a; /* TC 中不提示出错,只警告,但运行中可能出错*/
 p = *a; /* 或用 p = a[0] 都正确 */
 

7.scanf()中,在%后有一个"*"附加说明符,表示跳过指定的列数。
如:scanf("%2d %*3d %2d", &a, &b); 输入 12 345 67. 则12赋给a,67赋给b。

8.每次调用printf()、scanf(),都将返回一个整数值,其大小等于输出输入的字符个数。(printf()返回输出所有字符个数,scanf()返回赋值了的地址个数。
如:n = scanf("a = %d, %d, %d", &a, &b, &c); n为3.

9.由于getchar()要求以回车键结束输入,因此如果两个getchar()顺序出现时,第一个getchar()要求作为结束标志的回车键将被第二个getchar()接收。同样,如果getchar()出现在scanf()后边时,也会接收scanf()要求结束输入的回车符。

10.转义字符为\后跟一个特定字符或八进制或十六进制的整数。[不能为十进制数]
例:下列属于C语言合法的字符常数的是____.
A) '\97' B)"A" C)'\t' D)"\0"
选C。A中97不是一个正确的八进制或十六进制数。

11.printf()中%x 和 %X 都用来输出十六进制数,差别是:若十六进制数中出现"abcdef"这些字母时,前者显示小写字母,后者显示大写字母。

12.定义数组时,TC中数组长度不超过65535(2^16-1),即定义a[65536]时会出错。

13.else 和 if 的配对关系(易错点)。当 if 没有卢它配对的其他 else 时,else 总是与离自己前面最近的 if 配对。
例:有如下程序
main() {
int a = 2, b = -1, c = 2;
if (a < b)
if (b < 0) c = 0;
else c++;
printf("%d\n", c);
该程序的输出结果是____ A) 0 B) 1 C) 2 D) 3 (选C)

14.switch后面的表达式 e 只能是字符型或整型,且必须放在圆括号中,各个case中也只能使用整型常量或整型常量表达式。且 case 与其后的表达式之间必须留有空格。case 中出现的字符常数会自动转换成整型。

15.用 "%s" 控制的 scanf() 及 gets() 函数和 printf() 及 put() 函数在输入输出字符串时要求地址项作输入输出项。对一维数组,数组名就是地址量,对二维数组,数组名连同第一个下标作为地址量。
如:ch[10][80] 则 printf("%s", ch[1]); 输出

16.printf() 函数在输出字符串时,遇'\0'字符时结束。无换行功能。而 puts() 函数遇'\0'字符时结束输出,并把'\0'字符自动转换成换行符。
如:str = "Good morning", 则 printf("%s%s", str, str); 输出为 Good morningGood morning
而 puts(str); puts(str); 输出为
Good morning
Good morning

17.类型转换中,浮点型数据转换为整型只能换为以下几种:
(unsigned)int; (unsigned)long; (unsigned)long long;
如:float f = 23456.789; short s = f; /* Error!*/

18.gets(char *) 函数可以读入带空格的字符串并存入一个字符数组中,区别于 scanf() 中用 %s 不能读取空格。

19.防止头文件被重复定义:
#ifndef __headerfileXXX__
#define __headerfileXXX__
...
文件内容
...
#endif
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics