C语言的执行顺序是怎么样的迷糊了

C语言的执行顺序是怎么样的迷糊了,第1张

不是你想的从上往下

是从main函数下面开始按顺序执行的

是有函数的

有的时候输出函数放在主函数的上面,你不要看乱了

执行的时候可以调用上面的函数,你现在学的还少

学多了你就知道了

明白你的意思,执行顺序是,while(1)循环中,当中断返回flag1s=1时,此时不会发生跳转,将继续执行完以前的程序部分,直到循环的边界,再返回到while(1)首部开始。

while(1)

{

if(flag1s

==

1)

{

flag1s

=

0;

sec++;

LedBuff[0]

=

LedChar[sec%10];

LedBuff[1]

=

LedChar[sec/10%10];

LedBuff[2]

=

LedChar[sec/100%10];

//比如此时flag1s=1,则继续往下执行

LedBuff[3]

=

LedChar[sec/1000%10];

LedBuff[4]

=

LedChar[sec/10000%10];

LedBuff[5]

=

LedChar[sec/100000%10];

}

//到此返回从头开始,因此这段时间显示的还是之前的数据。

}

int x=1;

x=(x=1+2,x2);

赋值符号“=”优先级别比“,”逗号表达式要 高

(x=1+2,x2)=>6;

x=6

结果为x=6

K&R的书中一再强调"C is not a big language",当时看书的时候无法理解这句话的意思。现在我的理解是C标准本身的限制比较小,留给程序员的空间较大。这样一来C中的而有些问题标准就没有给出限定,就会产生一些让人迷惑的地方。今天我遇到了一个这样的问题,解决这些问题有的时候看起来是“钻牛角尖”,好吧,我就是一个爱钻牛角尖的人。这里需要解决的问题是执行顺序的问题,先给出几个问题。

执行完这两个语句后i和j的值各是什么?(看着是不是很熟悉,上次笔试考C中是不是有这个呢)

执行完上述语句后,i和数组arry中的值是多少?

输出结果是什么?(来自于C Puzzle Book Operators 16 )

先把这几个问题放在这里,先思考下,下面将会解决他们。

C语言经典著作 “The C Programming Language” 中对于side effects的定义:

这里述说的side effect可以理解为一种“副作用”,这种作用是改变一个变量的值。

“C In Nutshell” 中关于side effects的定义:

相对于K&R中的定义这里使用了对于环境的改变,这应该更加准确。总结:side effects 就是程序中的实体产生的改变,这里所说的实体通常指变量。

赋值,自增,自减表达式会产生side effects,函数调用表达式也有可能产生side effects。

序列点(sequence points)是一种逻辑意义的点,它的意义在于,逻辑点前的副作用(side effects)都在这时生效。C标准中定义的序列点总共有三类,第一类是完全表达式(full expression);第二类是||,&&,:和;第三类是函数调用,在所有的参数确定后、函数真正调用之前。

标准中规定了在前一个序列点前的副作用都会在前一个序列点后完成,但是标准没有规定两个序列点之间的副作用生效的顺序,不同的C语言实现的顺序可能不同。请注意这一点,这是所有问题产生的根本原因。如果两个序列点之间有超过两个的副作用作用在同一个实体上,这样不同的编译器产生的结果就不同,这种情况在标准中称为unspecified 。所以在实际应用中应该避免这种情况的出现,我把这一个原则称为为SS1。

是不是遵守了SS1原则就不会产生unspecified了呢?非也。可以设想这样一种情况:每一个实体(A)在两个序列点之间被两次使用,只有一次对这个实体本身产生副作用,另外一次被间接的用来产生副作用作用于另外一个实体(B)。在前面设想的这种情况下虽然符合SS1原则,但是我们会发现被间接用来产生副作用时,对于实体(B)产生的副作用肯定会跟实体(A)有关,但是这个实体(A)在这个序列点区间中有被副作用作用,那么我们就无法确定这个实体(A)的值了,从而实体(B)也就无法确定了。这里可以归纳为:在两个序列点之间,如果出现对一个实体的多次引用,并且只有一次会对该实体产生副作用(SS1),那么所有的这些引用都必须用来产生这个副作用 ,我把这一个原则称为SS2。只有同时遵守了SS1和SS2,写出的表达式才不是unspecified类型的。

可以清晰的看到标准中使用了两句话来概括这种问题,这正好对应于SS1,SS2原则。

下面给出更为具体的方法:

1)在一个表达式中最多只改变一个实体。

2)如果一个实体在一个表达式被改变,并且出现次数大于一次,请保证所有实体的出现都是为了产生这个“改变”。

例如: i = i+1;

3)如果不能遵守1),那么请保证改变的是不同的实体。

例如:c = p++;

4)如果1)和2)都不能遵守,那么请使用序列点将表达式分开。

例如 : (c = getchar()) != EOF && c != ‘\n’;

C语言中组成程序的基本单位是表达式(expression),表达式是指用 *** 作符(operator)和 *** 作数(operand)连接起来的式子。C标准给出了最基本的 *** 作符,通过这些 *** 作符可以组成简单表达式,同样也可以通过复合产生复杂表达式。当一个表达式中出现多个 *** 作符,多个 *** 作数的时候, *** 作符合 *** 作数是如何组合起来的呢?优先级和结合方向就是用来解决这个问题的,可以这么说,优先级和结合方向给出了一个表达式的含义,这只是说明了各个 *** 作符和 *** 作数是怎么聚合起来的。

仅仅依靠优先级和结合方向是无法确定一个复合表达式中对各个子表达式的求值顺序。标准中对于这点的规定是:

两个相邻的 *** 作符的执行顺序由它们的优先级决定。如果它们优先级相同,它们的执行顺序由它们的结合性决定。除此之外,编译器可以自由决定任何顺序对表达式进行求值,只要它不违反逗号,&&,||和?: *** 作符所施加的限制。

1)j = i++ + i++ + i++;

这个表达式违反了SS1,不同的编译器产生的结果可能不同。

2)arry[i] = i++;

这个表达式违反了SS2,不同的编译器产生的结果可能不同。

3)x = y = z = 1;

++x || ++y && ++z; PRINT(x, y, z);

&&的优先级比|| 的优先级高,所以:

++x || ++y && ++z 等效于++x || (++y && ++z)

这里就很容易犯错,会认为先执行++y && ++z 在执行++x || ( … ),这种观点是错误的,c中只对 逗号,、逻辑与 &&、

逻辑或 || 和 条件表达式规定了执行顺序,对于逻辑表达式方向是从左向右执行的。本例子中,先执行 ++x = 2,逻辑

或表达式被短路,++y && ++z没有执行,最后x = 2, y = 1, z = 1;

通过本课题的学习加深了对于c的理解,理解SS1,SS2原则。在实际应用中应该遵守“一条语句只做一件事的原则”。

进入程序后,就开始找main函数,可能是int main也可能是void main等。

然后可能遇到判断、循环、分支结构,然后按各自的语法分别执行,还可能遇到被调函数,到了那里就再去执行被调函数,执行完被调函数就再回来。

直到main函数全部执行完毕,直到最后一行结束,然后程序退出,运行界面出现perss any key to continue。

顺序就是从上到下。遇到一些结构遵循结构的语法进行,但是整体顺序就是由上到下。

从main函数开始到main函数结束。

答案选A。

C语言常考考点:

1、一个C语言源程序可以由一个或多个源文件组成。

2、每个源文件可由一个或多个函数组成。

3、一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。是整个程序的入口。

4、源程序中可以有预处理命令(包括include 命令,ifdef、ifndef命令、define命令),预处理命令通常应放在源文件或源程序的最前面。

5、每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。(结构体、联合体、枚举型的声明的“}”后要加“ ;”。)

6、标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。

扩展资料:

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。[1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。

C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。

其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。

参考资料:

百度百科--C语言

以上就是关于C语言的执行顺序是怎么样的迷糊了全部的内容,包括:C语言的执行顺序是怎么样的迷糊了、单片机C语言程序顺序问题、c语言执行顺序 求教等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9849487.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存