关于C的一些较为特殊的语法
语句块
- 写在一个大括号中的所有语句,称为一个语句块。通常用在
if
、循环
等语句之后,当之后只有一条语句时,可省。 - 特殊的,它几乎可以写在任何地方,但作用范围被限制,只在语句块中生效:
int a = 1; { int a = 2; printf("%d\n", a); } printf("%d\n", a);
如去掉大括号,将会编译错误。
int a = 1; int a = 2; printf("%d\n", a); printf("%d\n", a);
printf 与 三元表达式 的配合使用
对于平时的一些需求,想判断根据不同的结果,输出不同的数据,于是也许会有了以下的代码:
if(i>0) printf("%d大于0",i); else printf("%d小于或等于0",i);
为了仅仅一个功能,实在太繁琐了,实际printf支持以下语法,利用三元表达式,代码便能简洁很多了。
printf("%d", 1 > 0 ? 1 : 0); printf(1 < 0 ? "%d" : "%c", 65);
printf 的执行顺序
int a = 1; printf("%d,%d,%d\n", a, a + 1, a++);
- 若按自左向右执行,应输出:
1,2,1
- 但实际却输出:
2,3,1
int a = 1; printf("%d,%d,%d\n", a = a + 1, a + 1, a);
- 得出自右向左输出后,再猜测这个输出为:2,2,1
- 而实际却是:2,2,2
- 原因: 对于变量a , 应是所有表达式全部执行完成后,一起打印出来。而不是一个一个打印。
- 所以对于a=a+1、a 类似的表达式,将会被打印统一相同的值,它的值就是自右向左执行完所有表达式后,变量a的值。
- 而对于类似于a+1的表达式,并不会打印变量a的值,它没有赋值给a变量,只能当做一个常量去打印。
printf的返回值
举个栗子:
printf("%d-%d-%d-%d-%d", printf("1"),printf("22"),printf("333"),printf("4444"),printf("55555"));
- 输出结果: 5555544443332211-2-3-4-5
- 根据输出结果,也证明了printf函数是自右向左执行,先输出了555554444333221,再输出了printf的返回值, 分别是1-2-3-4-5,根据printf函数中的参数,很容易发现规律找出printf的返回值:打印字符的个数。
if中的条件判断
- 对于 if语句里的条件表达式, 有很多种表达的方式,方法不一,但使用相同。例:i!=0 便可直接写为一个 i,也可以有相同效果,且更简洁。因为C语言中规定,以数值0 表示"假",其余皆表示为“真”。但是注意0的不同表示形式,字符'\0'、NULL皆表示数值0,但是字符零'0' ,并不表示数值0,在ASCII码中,字符零以数值48表示。
- 所以以下的表达式都不执行
if(0) printf("0"); if('\0') printf("\'\\0\'"); if(NULL) printf("NULL");
if与else的配对问题
else
只与前 最近 未匹配对 的if
配对,一对一。注意三个点:1、在else
之前;2、离else
最近;3、未配对的if
。- 与缩进无关!!!这不是Python。
switch中的break
- 基本语法: 一般形式
switch(express) { case 1: printf("1"); break; case 2: printf("2"); break; case 3: printf("3"); break; default printf("default"); }
express
应是一个整形表达式,case
所选择的值,只能为常量,注意:字符也属于整形,且case
的值互斥。- 当第一个case的值成功与表达式匹配后,执行其
case
后的语句,再由break跳出,不再执行后面语句。
switch (express){ case 1: case 2: printf("2"); default: printf("default"); case 3: printf("3"); break; }
- 较为特殊的,break可省,case后可无语句,语句可省,default语句位置任意。但是,如果default前有case的值匹配,将会继续向后执行default语句中的内容,default的语句也不再是无值匹配时,才执行了。
- 对于所有case中的语句,有两种将会被执行的情况:1、case的值与表达式匹配;2、当前case之前的case语句的值与表达式相匹配,执行之前的语句中未有break跳出switch;
- 对于default语句也是有两种将会被执行的情况:1、所有的case都不匹配与表达式的值;2、之前的case语句的值与表达式相匹配,执行之前的语句中未有break跳出switch;
- 如switch在循环语句中,在switch中的break只对switch生效,无法跳出循环。
for循环默认值
- C语言中,一共有3个循环语句,其中
while
与do……while
必须中必须带有表达式,而for
循环中可省为空。但是for循环中的分号不能省! - 无限循环写法:
for(;;) printf("for中表达式如不写默认为'真'");
- 几乎所有情况下,三种循环都可以相互替换使用。根据实际需求一般选择较为简洁的一种。
define 宏定义
- define只是简单地字符替换,特别注意有无括号的区别。
- 可以嵌套,可以带参数,可以是一个语句。