文章目录
关于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只是简单地字符替换,特别注意有无括号的区别。
- 可以嵌套,可以带参数,可以是一个语句。