c 陷阱与缺陷(一)
2014-01-07 10:23
225 查看
1.程序在设计时,往往得出正确的结果,但是它并不是程序员自己想要的。
例如:
提示竟然出现在!的后面。因此 \ n 的使用变的尤为重要。
2. = 和 ==
while( c = ' ' || c == ' \t ' || c == ' \ n' )
这段程序程序员想表达的意思 当 c 为 空格、制表符、换行时,执行子程序。但是如果将== 写成 = 时,由于赋值运算符的优先级低于逻辑运算符。
‘ ’ 的ascii值为32,所以 c 永远不为0,则进入死循环。
3.编译器语法分析中的贪心法
编译器将程序分解成符号的方法是:从左到右一个一个字符的读入,如果该字符可能成为一个符号,则读入下一个字符,判断这两个字符是否为符号,如果是接着判断,直到不可能组成符号为止。
y= x/*p /* *p is pointed */; 编译器会解析成y=x;
正确写法应该(*p)加括号,或/ 与 * 之间加空格。
4. 整形的数如果 int a=076; // 会被编辑器解析成八进制数
5. 字符与字符串: 用单引号引起的一个字符实际上代表一个整数,用双引号引起的字符串,代表一个指向无名数组的起始字符的指针,该数组被 双引号之间的字符 和 一个
额外的二进制字符‘\0’初始化
6.嵌套注释:
/ */**/"*/"/*"/**/
1 #include<stdio.h>
2 int main()
3 {
4 printf("%s\n",/*/**/"*/"/*"/**/);
5 printf("%d",/*/*/0*/**/1);
6 printf("\n");
7 return 0;
8 }
例如:
printf("hello world!")编译器进行编译时不会出现任何问题,但是结果:
提示竟然出现在!的后面。因此 \ n 的使用变的尤为重要。
2. = 和 ==
while( c = ' ' || c == ' \t ' || c == ' \ n' )
这段程序程序员想表达的意思 当 c 为 空格、制表符、换行时,执行子程序。但是如果将== 写成 = 时,由于赋值运算符的优先级低于逻辑运算符。
‘ ’ 的ascii值为32,所以 c 永远不为0,则进入死循环。
1 #include<stdio.h> 2 int main() 3 { 4 char ch; 5 scanf("%c",&ch); 6 while(ch = ' ' || ch=='\t'|| ch== '\n') 7 { 8 printf("******\n"); 9 printf("%d\n",ch); 10 } 11 return 0; 12 }结果:
3.编译器语法分析中的贪心法
编译器将程序分解成符号的方法是:从左到右一个一个字符的读入,如果该字符可能成为一个符号,则读入下一个字符,判断这两个字符是否为符号,如果是接着判断,直到不可能组成符号为止。
y= x/*p /* *p is pointed */; 编译器会解析成y=x;
1 #include<stdio.h> 2 int main() 3 { 4 int a=10; 5 int *p=&a; 6 int y; 7 y=a/*p /* ********** */; 8 printf("%d\n",y); 9 }
正确写法应该(*p)加括号,或/ 与 * 之间加空格。
4. 整形的数如果 int a=076; // 会被编辑器解析成八进制数
1 #include<stdio.h> 2 int main() 3 { 4 int a=076; 5 printf("%d\n",a); 6 return 0; 7 }
5. 字符与字符串: 用单引号引起的一个字符实际上代表一个整数,用双引号引起的字符串,代表一个指向无名数组的起始字符的指针,该数组被 双引号之间的字符 和 一个
额外的二进制字符‘\0’初始化
6.嵌套注释:
/ */**/"*/"/*"/**/
允许嵌套 “/*” 不允许嵌套 “*/”
/*/*/0*/**/1 允许嵌套 1 不允许嵌套 0*1
1 #include<stdio.h>
2 int main()
3 {
4 printf("%s\n",/*/**/"*/"/*"/**/);
5 printf("%d",/*/*/0*/**/1);
6 printf("\n");
7 return 0;
8 }