美文网首页
C语言盲点知识梳理

C语言盲点知识梳理

作者: 酷叮猫少儿编程 | 来源:发表于2019-10-19 08:46 被阅读0次

1.函数参数的求值顺序依赖于编译器,例如f(a,a++);是先求a++还是求a不一定

2.C语言中的大多数运算符对其操作数的求值顺序也依赖于编译器

警告

int i = f() * g();这里先求f()还是先求g()不一定,所以不能写出要先实现f(),在实现g()的函数;

程序中的顺序点

定义:

指程序执行过程中修改变量值的最晚时刻。

有哪些顺序点

1.每个完整表达式结束后,即分号后面

2.&&,||,三木运算符(?:),以及逗号表达式的每一个运算对象计算之后

3.函数调用中对所有实际参数的求值完成之后(进入函数体之前)

考虑以下代码输出值

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char *argv[])

{

   int k = 2;

   int a = 1;

    k= k++ + k++;

   printf("k = %d\n",k);

   if(a--&&a)

    {

       printf("a = %d\n",a);

    }

   system("PAUSE");

   return 0;

}

分析:

1.k = k++ + k++;的顺序点在‘ ; ’后,所以k++到真正去修改内存值是在分号后面,所以编译器的行为是先k =2+2;之后k自增两次

2.在遇到&&时候,每一个运算对象之后就是一个顺序点所以a–执行后就是一个顺序点,所以这是就去内存修改了a的值,所以就是if(1&&0)所以不执行printf

再考虑以下代码

#include <stdio.h>

#include <stdlib.h>

int f(int i, int j)

{

   printf("%d, %d\n", i, j);

}

int main(int argc, char *argv[])

{

   int k = 1;

   f(k, k++);

   printf("%d\n", k);

   system("PAUSE");

   return 0;

}

输出结果

//2,1

//2

也就是 i =2,j = 1, k = 2

之前提到实参在传入函数之前对实参的求值完成之后是一个顺序点,也就是在进行值传递的时候K已经是2了。

相关文章

  • C语言盲点知识梳理

    1.函数参数的求值顺序依赖于编译器,例如f(a,a++);是先求a++还是求a不一定 2.C语言中的大多数运算符对...

  • C语言基础知识梳理总结

    C语言是当代人学习及生活中的必备基础知识,应用十分广泛,下面为大家带来C语言基础知识梳理总结,C语言零基础入门绝对...

  • C语言基础知识总结大全(干货)

    C语言是当代人学习及生活中的必备基础知识,应用十分广泛,下面为大家带来C语言基础知识梳理总结,C语言零基础入门绝对...

  • C语言知识点梳理

    C语言语法总结 写在开篇:本篇文章适合C语言初学者和想梳理和回顾一下C语言整体语法的看官,由于考虑不要对初学者灌以...

  • C语言编程基础知识梳理

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程...

  • 《iOS知识点梳理-C语言》

    知识点总结中,如有幸被您观看,更有可能看到不足,期待指出交流 前言 C语言,开发的基础功底,iOS很多高级应用都要...

  • C++开发工程师面试问题总结

    面试了一周的C++工程师,面试过程也是一个学习的过程,正好帮忙梳理一下知识盲点,所以做一个总结,方便以后查阅。主要...

  • c#集合

    C#基础知识简单梳理

  • 00Runtime之总体概括test-iOS逆风大神

    C语言知识

  • Cookie\ Session\ localStorage \s

    Cookie\ Session\ localStorage \sessionStorage\token知识梳理 C...

网友评论

      本文标题:C语言盲点知识梳理

      本文链接:https://www.haomeiwen.com/subject/jksgmctx.html