C语言中容易被忽略的细节(第一篇)

前言:本文的目的是记录C语言中那些容易被忽略的细节。我打算每天抽出一点时间看书整理,坚持下去,今天是第一篇,也许下个月的今天是第二篇,明年的今天又是第几篇呢?……我坚信,好记性不如烂笔头。

1、 在C语言中,符号之间的空白(包括空格符、制表符或换行符)将被忽略。但一个符号的中间不能有空白,否则可能被解释为另一个或几个符号。以下两种写法是等价的:

//写法1
if (x > big)
    big = x;

//写法2
if
(
x
>
big
)
big
=
x
;

2、编译器将程序分解为符号的“贪心法”(大嘴法)

从左到右逐个字符读入,如果该字符可能会组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已经不再可能组成一个有意义的符号为止。例如:

(1)a---b 与 a -- - b的含义相同,与a - -- b的含义不同。

(2)n-->0的含义是n-- > 0。

3、如果一个整型常量的第一个字符是数字0,那么该常量将被视为8进制数。例如:010实际表示为十进制中的8,它与10不同。

4、用单引号引起的一个字符实际上代表一个整数,整数的值等于该字符在编译器采用的字符集的序列值。例如:’a’的含义与0141(八进制)或97(十进制)严格一致。用双引号引起的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的2进制值为0的字符’\0’初始化。

5、a++为什么不能作为左值?

a++和++a的具体实现为:

//a++的实现
int temp;
temp = a;
a = a + 1;
return temp; 

//++a的实现
a = a + 1;
return a;

a++返回的是编译器自动分配的临时变量temp,这个temp并不是程序中定义的可寻址变量的引用,不能作为左值。而++a返回变量的引用。例如:

(1)i++ = 5,是错误的。++i = 5,是正确的。

(2)a+++++b,是错误的。因为它等价于a ++ ++ + b,即(a++)++ + b,a++不能作为左值,++运算需要左值。

(3)++a+++b,同样是错误的。

6、转义序列

有些字符具有特殊含义,想要将它们输出到终端上,一般有两种方式:使用转义序列或直接引用ASCII码值。

(1)转义序列:用反斜线(\)后跟一个特定转义字符组成的。常见转义序列如下表:

(2)直接引用ASCII码值:在字符串中可使用\o、\oo或\ooo(o为八进制数),\xh(h为16进制数)表达特殊字符。

7、输入 EOF 的方法:Windows/MS DOS 环境下,Ctrl+Z。Unix/Linux环境下,Ctrl + D。OS/400环境下,F4。

8、如何得到类型的类型转换符?

把声明中的变量名和声明末尾的分号去掉,再将剩余的部分用一个括号整个“封装”起来。例如:

(1)float (*h)();h是一个指向返回值为浮点类型的函数指针。(float (*)())表示“指向返回值为浮点类型的函数指针”的类型转换符。

(2)将常数0转型为“指向返回值为void的函数函数指针”类型的写法:(void (*)())0。

9、函数指针的调用形式

例如:void (*fp)();有两种调用形式:(*fp)()、fp()。fp()这种写法只是一种简写形式。

10、运算符的优先级

关键:任何一个逻辑运算符的优先级低于任何一个关系运算符;移位运算符的优先级比算术运算符要低,但是比关系运算符要高。

时间: 2024-12-24 07:57:28

C语言中容易被忽略的细节(第一篇)的相关文章

C语言中容易被忽略的细节(第四篇)

前言:本文的目的是记录C语言中那些容易被忽略的细节.我打算每天抽出一点时间看书整理,坚持下去,今天是第一篇,也许下个月的今天是第二篇,明年的今天又是第几篇呢?--我坚信,好记性不如烂笔头.第四篇了,fight~... 第一篇链接:C语言中容易被忽略的细节(第一篇) 第二篇链接:C语言中容易被忽略的细节(第二篇) 第三篇链接:C语言中容易被忽略的细节(第三篇) 1.void*类型的指针不能参与算术运算,只能进行赋值.比较和sizeof操作的原因? 指针的算术运算还要包含指针所指对象的字节数信息.

C语言中容易被忽略的细节(第二篇)

前言:本文的目的是记录C语言中那些容易被忽略的细节.我打算每天抽出一点时间看书整理,坚持下去,今天是第一篇,也许下个月的今天是第二篇,明年的今天又是第几篇呢?--我坚信,好记性不如烂笔头. 第一篇链接:C语言中容易被忽略的细节(第一篇) 1.C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来.C语言中数组元素可以是任何对象,也可以是另外一个数组,即数组的数组. 2.C语言允许初始化列表出现多余的逗号.例如:int days[] = {1,2,3,};作用:方便自动化生成代码.

C语言中容易被忽略的细节(第三篇)

前言:本文的目的是记录C语言中那些容易被忽略的细节.我打算每天抽出一点时间看书整理,坚持下去,今天是第一篇,也许下个月的今天是第二篇,明年的今天又是第几篇呢?--我坚信,好记性不如烂笔头.第三篇了,fight~... 第一篇链接:C语言中容易被忽略的细节(第一篇) 第二篇链接:C语言中容易被忽略的细节(第二篇) 1.__attribute__((noreturn)) __attribute__可设置函数属性.变量属性和类型属性.__attribute__((noreturn))设置了函数属性,n

程序猿之---C语言细节26(C语言中布尔类型、continue细节、sizeof举例、strlen举例)

主要内容:C语言中布尔类型.continue细节.sizeof举例.strlen举例 一.布尔类型 可能很多人不知道现在C语言已经有了布尔类型:从C99标准开始,类型名字为"_Bool" 在C99标准之前我们常常自己模仿定义布尔类型,常见有以下几种方式: 1.方式一 #define TURE 1 #define FALSE 0 2.方式二 typedef enum {false, true} bool; 3.方式三 typedef int bool 闲int浪费内存,对内存敏感的程序使

深入理解C语言中的指针与数组之指针篇(转载)

前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情,一直没有时间静下心来写这些东西,毕竟这确实是一件非常耗费时间和精力的事情:一方面,个人对C语言的掌握和理解也还有限,怕写出来的东西会对大家造成误导.当然,今天写的这些东西也肯定存在各种问题,不严谨甚至错误的地方肯定有,也希望大家来共同探讨,相互改进. 我会慢慢的写完这几章,有想法的童鞋可以和我探讨

Java中JNI的使用详解第一篇:HelloWorld

今天开始研究JNI技术,首先还是老套路,输出一个HelloWorld:具体流程如下:在Java中定义一个方法,在C++中实现这个方法,在方法内部输出"Hello World",然后再回到Java中进行调用.分为以下步骤: 第一步:在Eclipse中建立一个类:JNIDemo 1 package com.jni.demo; 2 public class JNIDemo { 3 //定义一个本地方法 4 public native void sayHello(); 5 public sta

C语言中一些乱七八糟的用法与细节(不断更新)

用C语言比较多,这篇是平时攒下的.有些内容在工作后可能会很常见,但是不用容易忘,所以就写篇博客吧. 一.printf的用法 %*可以用来跳过字符,可以用于未知缩进.像下面一样. for(i = 1; i < 10; i++) { printf("%*c\r%*c\n",  9 - abs(i - 5), '*', abs(i - 5) + 1, '*'); } %[]可以用来读取指定的内容,%[^]可以用来忽略指定内容(正则表达式?) %m可以不带参数,输出产生的错误信息 二.关

Java中容易被你忽略的细节(一)

1.在一个程序当中代码段访问了同一个对象从单独的并发的线程当中,那么这个代码段叫"临界区" 怎么解决呢:使用同步的机制对临界区进行保护 同步的两种方式:同步块和同步方法 对于同步来说都是使用synchronized方法 每一个对象都有一个监视器,或者叫做锁. java用监视器机制实现了进程之间的异步执行 2.Struts框架基于MVC模式 Struts的工作流程: 在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xm

职场中你忽略的细节,都是别人晋升的秘密

作为职场新人,在职场这门学问中,我们都还没有入门,这是我听完曹政老师的知识星球年终福利课<职场的真相>之后的感悟,曹政老师这门课针对的就是我们这样的职场新人,在课中曹政老师讲述了他自己当年在职场中所犯的错误并且指导年轻人该如何在职场中前行,虽然里面的不少观点在曹政老师的很多公众号文章中有提到过,但是经过曹政老师整理和解读之后,收获很多,这两天我也是反复的听,希望自己可以多吸收一点,在职场中走的顺利一些. 职场中不知道你是否跟我一样,有不少费解的地方,比如为什么我的技术明明比他强,但是他晋升的比