找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4003|回复: 0

《C专家编程》笔记2

[复制链接]
发表于 2012-1-16 10:24:13 | 显示全部楼层 |阅读模式
第二章 这不是Bug, 而是语言特性
无论在什么时候,如果遇见了这样一条语句malloc(strlen(str)); , 几乎可以断定它是错误的,malloc(strlen(str)+1);才对;
总结——进步是计算机软件工程和编程语言设计艺术逐步发展的重要动因;

[cpp] view plaincopyprint?


  • #include<stdio.h>

  • int main(int argc, char **argv)
  • {
  •     const int one = 1;

  •     int i = 1;
  •     switch(i) {
  •         case one: printf("1");
  •     }
  • }

#include<stdio.h>int main(int argc, char **argv) {        const int one = 1;        int i = 1;        switch(i) {                case one: printf("1");        }}

以上代码编译都不会通过,说明const 其实并不真正表示常量;
break 语句事实上跳出的是最近的那层循环语句或者switch 语句;
当sizeof 的操作数时个类型名时,两边必须加上括号,(这常常使人误以为它是个函数),但操作数如果是变量则不必加括号;
有些专家建议在C语言中记牢两个优先级就够了:乘法和除法大于加法和减法,在设计其他的操作符时一律加上括号;
操作符的结合性:它是仲裁者,在几个操作符具有相同优先级时决定先执行哪一个;
所有赋值符(包括符合赋值符)都具有右结合性;(又结合的也就两类一类是赋值符一类是单目运算符);

[cpp] view plaincopyprint?


  • #include<stdio.h>
  • #include<string.h>
  • char * f()
  • {
  •     char buf[10];

  •     strcpy(buf, "abcdefg");
  •     return buf;
  • }
  • int main(int argc, char **argv)
  • {
  •     printf("%s",f());
  • }

#include<stdio.h>#include<string.h>char * f() {        char buf[10];        strcpy(buf, "abcdefg");        return buf;}int main(int argc, char **argv) {        printf("%s",f());}
以上代码打印不出预计值,因为buf是局部变量,函数结束时,由于该变量已被销毁,谁也不知道这个指针所指向的地址的内容是什么;


http://blog.csdn.net/mingchaoyan/article/details/7203453
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-4 15:59 , Processed in 0.012249 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表