C 细节注意

大一学 C 语言时收集的,整理如下。

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

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

#include
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 morningGood 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值