C的温故知新

原创 2006年06月03日 20:02:00
    前几日看了张孝祥老师的C语言测试题,惊诧于自己在语法上的懵懂和经验上的欠缺。昨天再次拾起了《C程序设计语言》,仔细复习了前三章,将自己平时不太注意的地方整理了一下。

1.关于整数之间相除的舍位,商的小数部分将全被舍弃,因此在有整数相除的连续运算中应该注意运算的顺序

int celsius1 ,celsius2,fahrenheit = 100;
celsius1 = 5/9*(fahrenheit-32);//celsius结果是零
celsius2 = 5*(fahrenheit-32)/9;//输出celsius结果是37,相对正确,但不够精确
-------------------------------
float celsius3,fahrenheit2 = 100.0;
celsius3 =5.0/9.0*(fahrenheit-32);//输出celsius结果为37.777779
-------------------------------------------------------------------------
int fahrenheit = 100.5f;//输出fahrenheit结果为100
即将float型赋给int型时,小数部分被截取掉。而将double赋给float时,是否四舍五入取决于具体的机器实现。

2.strlen(char* str)函数返回字符串参数str的长度,但不包括其末尾的'/0'。即它根据'/0'判断字符串是否结束。

3.关于枚举
    枚举是一个常量整型值的列表。无显式说明的情况下,第一个枚举常量是0,第二个是1,往后类推。而如果对部分常量值进行了指定,那么对未指定值的枚举名的值将依最後一个指定值向后递增。不同枚举中的名字必须互不相同。同一枚举中的不同名字可以有相同的值。枚举相对于#define定义符号常量的优势就是常量值可以自动生成。

4.continue语句只用在循环语句(for,while,do-while)中,不能用在switch语句中。switch语句的case标签(Label)必须是整数。

5.逻辑非运算符!将把非零操作数转化为0,将操作数0转化为1。

void main(void)
{
       int celsius1 = 9;

       if(celsius1==!!celsius1)
               printf("celsius1 equals !!celsius1/n");
       else
               printf("celsius1 does not equal !!celsius1/n");
}
运行结果
[dog@dog ~]$ ./test.out
celsius1 does not equal !!celsius1

6.关于变量的串联赋值

void main(void)
{
       int i,j,k;
       i=j=k=0;

       printf("i=%d,/tj=%d,/tk=%d/n",i,j,k);
}
运行结果
[dog@dog ~]$ ./test.out
i=0,    j=0,    k=0

课本对此所述如下:在兼有值与赋值两种功能的表达式中,赋值接合次序是由右向左.上面语句就是
i=(j=(k=0));
即把表达式k=0的值赋给了j,这里就引出一点:赋值语句的值是多少?
void main(void)
{
       int i;
       if(i=9)
               printf("Y/n");
       else
               printf("N/n");
}
结果
[dog@dog ~]$ ./test.out
Y


void main(void)
{
       int i;
       if(i=0)
               printf("Y/n");
       else
               printf("N/n");
}
的结果是
[dog@dog ~]$ ./test.out
N
也就是说,赋值表达式的值就是右边表达式的值.

7.关于变量的声明(declaration)和定义(define)

    定义表示创建变量或分配存储单元;而声明只是说明变量性质,并不分配存储单元

extern int a;
void main(void)
{
      printf("a = %d/n", a);
}

the compile process reports error as
[dog@dog ~]$ cc test.c -o test.out
test.c: 在函数 'main' 中:
test.c:28: 错误:stray '/226' in program
test.c:28: 错误:stray '/128' in program
test.c:28: 错误:stray '/156' in program
test.c:28: 错误:syntax error before '%' token
test.c:28: 错误:stray '/' in program
test.c:28: 错误:stray '/226' in program
test.c:28: 错误:stray '/128' in program
test.c:28: 错误:stray '/157' in program

In the program,variable a is only  declared ,but not defined,so the compiler can't find the definition of a.如果没有变量a的定义,那么任何对变量a的操作都是非法的,因为这个变量还不存在。定义时可以给变量赋初值;但声明变量时不能给它赋初值,原因是声明的变量还没有存储空间。

8.“由于函数调用的参数是表达式,所以把参数传递给函数时也可能进行类型转换。在没有函数原型的情况下,char和short类型都将被转换成int类型,float类型将被转换成double类型。因此,及时调用函数的参数是char或float类型,我们也把函数参数声明为int或double类型。”

double d=(double)n
“强制类型转化只是生成一个指定类型的n的值,n本身的值并没有改变”

9. ANSI C使用类型void*代替了char*,用作通用指针的类型。

10 .地址运算符&只能用于内存中的对象,即变量和数组元素,而不能用于表达式、常量或register类型的变量。

11.  指针pa+i指向pa所指对象后的第i个对象,即所有指针运算都会自动考虑它所指向的对象的长度。在计算数组元素a[i]的值时,C语言实际上先将其转换成*(a+i)的形式,然后再进行求值。

12.  指针和数组名之间的一个区别:指针是变量,它的值可变;而数组名的值不能变。假设pa是指针名,a是数组名,则pa=apa++等都是可以的,而a=paa++等操作为非法。

13.  char amessage[] = “Hello,world”;

char* pmessage = “Hello,world”;

数组amessage中的单个字符可以进行修改,但它始终指向同一个存储位置。而pmessage是一个指针,其初值指向一个字符串常量,之后它可以被修改以指向其他地址,但字符串的内容是不能修改的。如

void f(){
        amessage[3] = ’i’;//ok
        pmessage[3] = ’i’;//error
    }

温故知新——五大常用算法总结

分治法 动态规划 贪心 回溯法 分支
  • dd864140130
  • dd864140130
  • 2016年03月05日 12:07
  • 955

正则表达式--温故知新

1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 正则表...
  • shenwansan_gz
  • shenwansan_gz
  • 2016年09月13日 10:48
  • 270

JAVA 温故知新

在继承时类的加载顺序 代码如下: class Parent {     // 静态变量     public static String p_StaticField = "父类--静态...
  • u014764572
  • u014764572
  • 2016年11月21日 18:29
  • 104

今日温故知新

1782:谁是你的潜在朋友 失败代码: #include #include #include using namespace std; int main(){ int N,M; int P[...
  • heathufei
  • heathufei
  • 2014年01月24日 20:47
  • 449

今日温故知新

该注意的错误代码: #define _CRT_SECURE_NO_WARNINGS #include #include int main(){ int t;//0...
  • heathufei
  • heathufei
  • 2014年01月22日 21:58
  • 950

C++温故知新----0

仅供本人学习,不具有参考性 存疑概念: 。不同机器数据类型的位数: 1、不同位数的机器上有差别的主要是指针的长度,因为可以寻址的空间有区别;  2、int的长度则依赖于编译器。 http:/...
  • qq_38285023
  • qq_38285023
  • 2017年12月17日 22:17
  • 25

今日温故知新

点击打开链接 //1000: #include int main(){ int a,b; while(scanf("%d %d",&a,&b)!=EOF){ printf("%d\n",a+b...
  • heathufei
  • heathufei
  • 2014年01月21日 21:26
  • 462

verilog温故知新

实验室学长让我重新把verilog书看看,拿起以前的课本就看了起来。有些新的东西在这记下了。 关于阻塞和非阻塞赋值,记住八大原则: 1、时序电路建模时,用非阻塞赋值; 2、锁存器电路建模时,用非阻...
  • hunterlew
  • hunterlew
  • 2014年12月11日 19:10
  • 612

Swift 温故知新

仔细想了想,我学swift的时候还是我刚接触ios开发的时候了,那时swift还是beta版,当时因为考虑到时beta版,有许多东西经常变,还没有定论,所以就没有投入过多的精力去学习,后来工作也一直用...
  • Kenny_cn
  • Kenny_cn
  • 2017年06月17日 20:37
  • 122

今日温故知新

C语言中字符串的操作通过字符数组来实现的. gets函数 函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。 //函数:g...
  • heathufei
  • heathufei
  • 2014年01月23日 20:17
  • 487
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C的温故知新
举报原因:
原因补充:

(最多只允许输入30个字)