【关于C的一些较为特殊的语法】

简介: 【关于C的一些较为特殊的语法】

关于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个循环语句,其中whiledo……while必须中必须带有表达式,而for循环中可省为空。但是for循环中的分号不能省!
  • 无限循环写法:
for(;;)
    printf("for中表达式如不写默认为'真'");
  • 几乎所有情况下,三种循环都可以相互替换使用。根据实际需求一般选择较为简洁的一种。


define 宏定义


  • define只是简单地字符替换,特别注意有无括号的区别。
  • 可以嵌套,可以带参数,可以是一个语句。
相关文章
|
6月前
|
安全 Swift iOS开发
switf定义和语法
switf定义和语法
64 2
|
3天前
|
存储 容器
JavaSpcript语法
通常高级程序设计语言所包含的语法内容: 1、关键字:该种语言中被赋予了特殊含义的单词。 2、标识符:用于标识数据跟表达式的符号。通常可以理解为在程序中自定义的名称。如变量名,函数名。 3、注释:注解说明解释程序,用于调试程序 4、变量:用于标识内存中一片空间。用于存储数据,该空间中的数据是可以变化的。当数据不确定时用变量。 5、运算符:可以让数据进行运算的符号。 6、语句:用于对程序的运行流程进行控制的表达式。 7、函数:用于对功能代码进行封装,便于提高复用性。 8、数组:对多数据进行存储,便于操作,也就是容器。 9、对象:只要是基于对象或者面向对象的语音,就存在对象的概念,对象就是一个封装体
|
8天前
|
XML 数据格式
XLink 和 XPointer 语法
XLink 和 XPointer 语法
9 2
|
SQL
函数的语法
函数的语法
107 1
|
安全 编译器 C#
2.1C#新语法
C#实用新语法
|
安全 C#
C#——特殊语法
C#——特殊语法
111 0
Pathon语法
之前学pathon写的一些总结
Pathon语法
|
前端开发