-
2022-02-05 00:58:47
首先我们给出定义,在C语言的同一函数中,各复合语句内可以定义变量,其作用域仅为本复合语句内;
C语言中的静态全局变量所占用的内存是不释放的,其关键字为static;
如何理解这段话,我们可以写一小段代码:
#include<stdio.h> int fun(int n) { int t=0; static int a=1; if(n==1){ int a=3;t+=a; }else{ int a=4;t+=a; } printf("a=%d\n",a); printf("t=%d\n",t); return t+a++; } main() { int s=0; s=fun(1); printf("t+a=%d\n",s); s=fun(0); printf("t+a=%d\n",s); }
其运行结果为:
a=1 t=3 t+a=4 a=2 t=4 t+a=6
通过这段代码我们再给出一个定义,何为复合语句?在C语言中通过花括号{}组合起来的一个或多个语句,就是复合语句;
所以在if语句内我们两次定义了变量a的值,这奏效了,也使得t的值改变了,但山高皇帝远,出了这个if语句的括号,别人也就不认了,在return函数值时,a的值任为函数一开始定义的那个值,也就是1;
我们还注意到了一个东西,就是我们第二次进入fun函数时,a的值变成了2,尽管我们在这一轮函数开始时又将a定义为了1;
static int a=1;
这就是静态全局变量,他的值在第一次初始化之后,就不会再进行初始化赋值了,这个变量可以保存他在这个函数里面的变化,下次调用fun时,永远获得最新的a;
但是这也仅仅只能在fun()中进行变化,所以,a是一个静态局部变量;
更多相关内容 -
对Python中for复合语句的使用示例讲解
2020-09-19 23:57:42今天小编就为大家分享一篇对Python中for复合语句的使用示例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
详解C++编程中标记语句与复合语句的写法
2021-01-20 07:01:50有三种标记语句。它们全都使用冒号将某种标签与语句隔开。case 和 default 标签特定于 case 语句。 #include using namespace std; void test_label(int x) { if (x == 1){ goto label1; } goto -
批处理命令教学之复合语句连接符(&、&&和||)
2020-09-22 07:36:46主要介绍了批处理命令教学之复合语句连接符(&、&&和||)的相关资料,需要的朋友可以参考下 -
Java复合语句的使用方法详解
2020-08-29 12:11:03主要介绍了Java编程中复合语句,结合相关的具体实例介绍了其用法,需要的朋友可以参考下 -
复合语句
2020-11-29 19:34:47复合语句是包含其它语句(语句组)的语句;它们会以某种方式影响或控制所包含其它语句的执行。 通常,复合语句会跨越多行,虽然在某些简单形式下整个复合语句也可能包含于一行之内。 if, while 和 for 语句用来实现...复合语句是包含其它语句(语句组)的语句;它们会以某种方式影响或控制所包含其它语句的执行。 通常,复合语句会跨越多行,虽然在某些简单形式下整个复合语句也可能包含于一行之内。
if, while 和 for 语句用来实现传统的控制流程构造。 try 语句为一组语句指定异常处理和/和清理代码,而 with 语句允许在一个代码块周围执行初始化和终结化代码。 函数和类定义在语法上也属于复合语句。
一条复合语句由一个或多个‘子句’组成。 一个子句则包含一个句头和一个‘句体’。 特定复合语句的子句头都处于相同的缩进层级。 每个子句头以一个作为唯一标识的关键字开始并以一个冒号结束。 子句体是由一个子句控制的一组语句。 子句体可以是在子句头的冒号之后与其同处一行的一条或由分号分隔的多条简单语句,或者也可以是在其之后缩进的一行或多行语句。 只有后一种形式的子句体才能包含嵌套的复合语句;以下形式是不合法的,这主要是因为无法分清某个后续的 else 子句应该属于哪个 if 子句:
if test1: if test2: print(x)
还要注意的是在这种情形下分号的绑定比冒号更紧密,因此在以下示例中,所有 print() 调用或者都不执行,或者都执行:
if x < y < z: print(x); print(y); print(z)
总结:compound_stmt ::= if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | async_with_stmt | async_for_stmt | async_funcdef suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT statement ::= stmt_list NEWLINE | compound_stmt stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
请注意语句总是以 NEWLINE 结束,之后可能跟随一个 DEDENT。 还要注意可选的后续子句总是以一个不能作为语句开头的关键字作为开头,因此不会产生歧义(‘悬空的 else’问题在 Python 中是通过要求嵌套的 if 语句必须缩进来解决的)。
为了保证清晰,以下各节中语法规则采用将每个子句都放在单独行中的格式。
if 语句
if 语句用于有条件的执行
if_stmt ::= "if" assignment_expression ":" suite ("elif" assignment_expression ":" suite)* ["else" ":" suite]
它通过对表达式逐个求值直至找到一个真值(请参阅 布尔运算 了解真值与假值的定义)在子句体中选择唯一匹配的一个;然后执行该子句体(而且 if 语句的其他部分不会被执行或求值)。 如果所有表达式均为假值,则如果 else 子句体如果存在就会被执行。
while 语句
while 语句用于在表达式保持为真的情况下重复地执行:
while_stmt ::= "while" assignment_expression ":" suite ["else" ":" suite]
这将重复地检验表达式,并且如果其值为真就执行第一个子句体;如果表达式值为假(这可能在第一次检验时就发生)则如果 else 子句体存在就会被执行并终止循环。
第一个子句体中的 break 语句在执行时将终止循环且不执行 else 子句体。 第一个子句体中的 continue 语句在执行时将跳过子句体中的剩余部分并返回检验表达式。
for 语句
for 语句用于对序列(例如字符串、元组或列表)或其他可迭代对象中的元素进行迭代:
for_stmt ::= "for" target_list "in" expression_list ":" suite ["else" ":" suite]
表达式列表会被求值一次;它应该产生一个可迭代对象。 系统将为 expression_list 的结果创建一个迭代器,然后将为迭代器所提供的每一项执行一次子句体,具体次序与迭代器的返回顺序一致。 每一项会按标准赋值规则 (参见 赋值语句) 被依次赋值给目标列表,然后子句体将被执行。 当所有项被耗尽时 (这会在序列为空或迭代器引发 StopIteration 异常时立刻发生),else 子句的子句体如果存在将会被执行,并终止循环。
第一个子句体中的 break 语句在执行时将终止循环且不执行 else 子句体。 第一个子句体中的 continue 语句在执行时将跳过子句体中的剩余部分并转往下一项继续执行,或者在没有下一项时转往 else 子句执行。
for 循环会对目标列表中的变量进行赋值。 这将覆盖之前对这些变量的所有赋值,包括在 for 循环体中的赋值:
for i in range(10): print(i) i = 5 # this will not affect the for-loop # because i will be overwritten with the next # index in the range
目标列表中的名称在循环结束时不会被删除,但如果序列为空,则它们根本不会被循环所赋值。 提示:内置函数 range() 会返回一个可迭代的整数序列,适用于模拟 Pascal 中的 for i := a to b do 这种效果;例如 list(range(3)) 会返回列表 [0, 1, 2]。
注解 当序列在循环中被修改时会有一个微妙的问题(这只可能发生于可变序列例如列表中)。 会有一个内部计数器被用来跟踪下一个要使用的项,每次迭代都会使计数器递增。 当计数器值达到序列长度时循环就会终止。 这意味着如果语句体从序列中删除了当前(或之前)的一项,下一项就会被跳过(因为其标号将变成已被处理的当前项的标号)。 类似地,如果语句体在序列当前项的前面插入一个新项,当前项会在循环的下一轮中再次被处理。 这会导致麻烦的程序错误,避免此问题的办法是对整个序列使用切片来创建一个临时副本,例如 for x in a[:]: if x < 0: a.remove(x)
try 语句
try 语句可为一组语句指定异常处理器和/或清理代码:
try_stmt ::= try1_stmt | try2_stmt try1_stmt ::= "try" ":" suite ("except" [expression ["as" identifier]] ":" suite)+ ["else" ":" suite] ["finally" ":" suite] try2_stmt ::= "try" ":" suite "finally" ":" suite
except 子句指定一个或多个异常处理器。 当 try 子句中没有发生异常时,没有异常处理器会被执行。 当 try 子句中发生异常时,将启动对异常处理器的搜索。 此搜索会依次检查 except 子句,直至找到与该异常相匹配的子句。 如果存在无表达式的 except 子句,它必须是最后一个;它将匹配任何异常。 对于带有表达式的 except 子句,该表达式会被求值,如果结果对象与发生的异常“兼容”则该子句将匹配该异常。 一个对象如果是异常对象所属的类或基类,或者是包含有兼容该异常的项的元组则两者就是兼容的。
如果没有 except 子句与异常相匹配,则会在周边代码和发起调用栈上继续搜索异常处理器。 1
如果在对 except 子句头中的表达式求值时引发了异常,则原来对处理器的搜索会被取消,并在周边代码和调用栈上启动对新异常的搜索(它会被视作是整个 try 语句所引发的异常)。
当找到一个匹配的 except 子句时,该异常将被赋值给该 except 子句在 as 关键字之后指定的目标,如果存在此关键字的话,并且该 except 子句体将被执行。 所有 except 子句都必须有可执行的子句体。 当到达子句体的末尾时,通常会转向整个 try 语句之后继续执行。 (这意味着如果对于同一异常存在有嵌套的两个处理器,而异常发生于内层处理器的 try 子句中,则外层处理器将不会处理该异常。)
当使用 as 将目标赋值为一个异常时,它将在 except 子句结束时被清除。 这就相当于
except E as N: foo
被转写为
except E as N: try: foo finally: del N
这意味着异常必须赋值给一个不同的名称才能在 except 子句之后引用它。 异常会被清除是因为在附加了回溯信息的情况下,它们会形成堆栈帧的循环引用,使得所有局部变量保持存活直到发生下一次垃圾回收。
在一个 except 子句体被执行之前,有关异常的详细信息存放在 sys 模块中,可通过 sys.exc_info() 来访问。 sys.exc_info() 返回一个 3 元组,由异常类、异常实例和回溯对象组成(参见 标准类型层级结构 一节),用于在程序中标识异常发生点。 当从处理异常的函数返回时 sys.exc_info() 的值会恢复为(调用前的)原值。
如果控制流离开 try 子句体时没有引发异常,并且没有执行 return, continue 或 break 语句,可选的 else 子句将被执行。 else 语句中的异常不会由之前的 except 子句处理。
如果存在 finally,它将指定一个‘清理’处理程序。 try 子句会被执行,包括任何 except 和 else 子句。 如果在这些子句中发生任何未处理的异常,该异常会被临时保存。 finally 子句将被执行。 如果存在被保存的异常,它会在 finally 子句的末尾被重新引发。 如果 finally 子句引发了另一个异常,被保存的异常会被设为新异常的上下文。 如果 finally 子句执行了 return, break 或 continue 语句,则被保存的异常会被丢弃:
>>> def f(): ... try: ... 1/0 ... finally: ... return 42 ... >>> f() 42
在 finally 子句执行期间,程序不能获取异常信息。
当 return, break 或 continue 语句在一个 try…finally 语句的 try 子语句体中被执行时,finally 子语句也会‘在离开时’被执行。
函数的返回值是由最后被执行的 return 语句所决定的。 由于 finally 子句总是被执行,因此在 finally 子句中被执行的 return 语句总是最后被执行的:
>>> def foo(): ... try: ... return 'try' ... finally: ... return 'finally' ... >>> foo() 'finally'
有关异常的更多信息可以在 异常 一节找到,有关使用 raise 语句生成异常的信息可以在 raise 语句 一节找到。
-
python——这7种复合语句在编写时要遵循什么?
2021-01-30 02:48:04python有几种类型的复合语句:if、for、while、def、class、try/except、with/as等。这些复合类型的语句在编写时,要遵循python的语法风格:1.冒号结尾复合语句的声明,如if expr:、def f():2.通过缩进数量决定代码...python有几种类型的复合语句:if、for、while、def、class、try/except、with/as等。
这些复合类型的语句在编写时,要遵循python的语法风格:
1.冒号结尾复合语句的声明,如if expr:、def f():
2.通过缩进数量决定代码块层次,同级别的代码块缩进数量相同也就是通过缩进来取代其它语言中的{}表示的代码块层次
3.代码体部分缩进,缩进数量随意,但同一层次的代码块缩进数量必须相同
4.如果代码体部分只有一个语句,可以直接放在声明行冒号的后面,如if expr: print('a')
5.可以使用空格或制表符进行缩进,但缩进同一层次时,不要混用空格或制表符
6.允许这些复合语句的声明行部分的表达式不使用括号包围,但使用括号也不会错,使用括号是为了确保表达式的优先级
7.python中的括号类型(如小括号、中括号、大括号)都可以让代码换行书写,也就是续行。虽然\也有效,但不建议。
例如:
1 if a > 3:2 print('hello world1')3 print('hello world2')4 else:5 print('hello world else')
上面if和else位于同一层次的全局(文件)代码块,if的主分支两个语句位于同一层次的代码块(缩进相同)。在其他语言中,对等的写法大概如下:1 if (a > 3) {2 print('hello world1')3 print('hello world2')4 } else {5 print('hello world else')6 }
python中,条件表达式部分加上括号也没问题:
1 if (a>3):2 ...
如果代码体只有单个语句,代码体可以直接放在冒号后面。例如:1 if a > 3:print('a')2 def f():print('a')3 class F:pass
括号类型包围的内容,包括列表的中括号[]、集合或字典的大括号{}、元组或表达式或包围函数参数的小括号(),它们可以随意换行。
例如:
1 a = 'aaa' + 'bbb'2 a = ('aaa' + 3 'bbb')4 5 L = [11,22,33,44]6 L = [11,22,7 33,44]89 D = {'k1':'v1', 'k2':'v2', 'k3':'v3'}10 D = {'k1':'v1',11 'k2':'v2',12 'k3':'v3'}1314 if a > 3: print(a)15 if (a >16 3):print(a)
-
C语言的复合语句表达式
2020-07-26 20:10:48看一个例子 int main(void) { int x = 10; int y = 1; int c = ({x;y;}); printf("c = %d\n",c); } 第 5 行,这样写合法吗? 答案是合法,结果输出 1 再比如 ({ int y = foo();...这就是复合语句表达式。看一个例子
int main(void) { int x = 10; int y = 1; int c = ({x;y;}); printf("c = %d\n",c); }
第 5 行,这样写合法吗?
答案是合法,结果输出 1
再比如
({ int y = foo(); int z; if(y > 0) z = y; else z = -y; z; })
这就是复合语句表达式。
1、一对圆括号在外边,一对大括号在里面。
2、复合语句可以有函数调用、变量赋值甚至是控制流代码块。
3、最后一条语句必须以分号结尾。
4,最后一条语句的值,将作为整个表达式的值
5、如果你在大括号里的最后一句用的是没有返回值的语句,则整个表达式的返回类型为 void,即没有合法的返回值
参考资料
https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
-
C语言中,可将一系列语句置于一对( )之间从而构成复合语句。
2021-05-21 12:58:35正确的有,语言中语句对语句关于预算,表述中以下。系列物Q形成作用河流冲刷冲积。物堆其次积是生,置于之间物质物先期的来的风化产沉积源主要是岩石。片理状构造名词解释。叙(,乐府多用曹操旧题。名词压碎结构解释... -
【c++教程】4.2-复合语句
2021-10-12 22:05:443,复合语句的结束不需要分号,当然也许从这是一个语句的角度来说,应该要写分号才对,但是不写分号可以算作是一种福利。也就是既然已经知道它在哪里结束了,就不用再额外写结束标志了。 复合语句 -
单片机C语言中的表达式语句及复合语句
2020-04-02 13:55:261. 表达式语句 在表达式的后边加一个分号“;”就构成了表达式语句 ,如: a=++b*9; x=8;y=7;...可以一行放一个表达式形成表达式语句,也...空语句在程序设计中通常用于两种情况: (1)在程序中为有关语句提供标... -
C语言复合语句
2020-02-13 23:07:02复合语句内的变量定义是独立的,即复合语句内定义的变量不影响复合语句外的同一个标识符的变量,且复合语句内定义的变量不能供复合语句外调用,只能在复合语句外单独定义,单独使用。 但是复合语句外定义的变量可以... -
初探SQL语句复合主键与联合主键
2020-09-09 13:30:29主要介绍了初探SQL语句复合主键与联合主键的相关内容,具有一定参考价值,这里给大家分享下,需要的朋友可以参考。 -
C程序中,用一对大括号{}括起来的多条语句称为复合语句,复合语句在语法上被认为是一条语句。
2021-05-21 17:04:10C程序中,用一对大括号{}括起来的多条语句称为复合语句,复合语句在语法上被认为是一条语句。序中“经”是一种在理论体系建构上从现象界到本体界反推的逻辑。()用对语句条语句《中华人民共和国网络安全法》是我国第... -
Javascript中With语句用法实例
2020-10-24 05:43:37主要介绍了Javascript中With语句用法,实例分析了javascript中with语句的相关使用方法,类似VB语句的用法,需要的朋友可以参考下 -
C中的复合语句总结
2017-12-02 10:15:19C中表达式和复合语句的如下: ({exp1; exp2; exp3;}) 其值等于exp3的值。如果exp3不能求值,得到的结果就是void。 如下: ( {int a = 2+1; int b = 0; b;} ) // 0 ( {int a = 2+1; int b = 0; int c = 0;} ) // ... -
JAVA复合语句
2018-07-14 21:56:52复合语句中的每个语句都是从上到下执行的,并且在复合语句中可以嵌套复合语句。public class Compound { public static void main(String[] args) { int a = 21; { //复合语句1 start in... -
计算机二级C语言考点归纳:复合语句.docx
2021-10-02 11:26:22计算机二级C语言考点归纳:复合语句.docx -
C语言中语句种类有哪些
2021-05-21 04:57:09学C语言要熟记那些基本语句?一、C语言的结构1、 程序的构成,MAIN函数和其他函数2、 头文件,数据说明,函数的开始和结束标志3、 源程序的书写格式4、 C语言的风格二、数据类型及其运算1、 C的数据类型(基本类型,... -
C语言程序设计(第2版)-2期 常见问题4-3 if语句后需执行的多条语句未构成复合语句.pdf
2022-07-12 21:09:15C语言程序设计(第2版)-2期 常见问题4-3 if语句后需执行的多条语句未构成复合语句.pdf 学习资料 复习资料 教学资源 -
关于“在一个函数内的复合语句中定义的变量可以在本函数范围内有效”的正误判断
2020-02-12 10:59:58这句话是错误的,因为一个函数内部可以有多个复合语句。 举个栗子: void main(void) { // 复合语句1 { // 复合语句2 int a = 10; } printf("%d\n",a); }``` ![编译后报错:变量a未定义]... -
【C++学习笔记】for循环中的复合语句(语句块)
2017-04-15 23:30:281、C++for语句的格式循环体要求必须要是一条语句,使用两个花括号则可以构成一条复合语句(代码块) 如果在语句块中定义一个新的变量,则仅当该程序执行该语句块中的语句时,该变量才存在。执行完语句块后,变量将... -
C语言中语句种类有哪些?
2021-05-20 19:16:234 复合语句;5 空语句。1) 表达式语句表达式语句由表达式加上分号“;”组成。其一般形式为:表达式;执行表达式语句就是计算表达式的值。例如 c=a+a;2) 函数调用语句由函数名、实际参数加上分号“;”组成。其一般形式... -
55-C++复合语句(语句块)
2018-09-07 23:46:24方法是用两个花括号来构造一条复合语句(代码块)。代码块由一对花括号和它们包含的语句组成,被视为一条语句,从而满足句法的要求。例如,下列程序使用花括号将3条语句合并为一个代码块。这样,循环体... -
SQL 复合语句解析
2017-10-02 14:11:13—————————————————1、建表wepon_...3、将选取的数据复制到wepon_merchant3中create table wepon_merchant3 as select merchant_id,user_id,coupon_id,distance,date_received,date_pay from wepon_ -
为什么C语言程序中if和else后的语句执行不了?
2021-05-19 11:35:20(当条件1不为真,条件2为真执行这里)else条件1,条件2都不为真,执行这里我将你的程序修改一下:#include#includeint main(){float a,b,c,z;printf("请输入方程的a,b,c:\n");scanf("%f,%f,%f",&a... -
Java语言基础(四)-复合语句
2017-03-09 23:43:44复合语句、条件语句、循环语句、循环控制