A. 在c语言编程中,传值方式和传引用方式之间有什么区别
在C语言中,并没有引用的概念,这个是C++的概念。
在C++的函数参数中,有两种形式,其中
TYPE & var的形式,称为传引用方式;
TYPE var的形式,称为传值。
二者的区别为,当传引用时,实际传到函数中的形参,是实际参数的一个引用,而不是仅传递值到函数中。具体的表现有以下几条:
1 传引用时,形参和实参是同一个变量,即使用相同的内存空间,二者有相同的地址。而传值时二者地址不同;悉竖
2 传引用时,由于没有新建变量,所以对于类对象参数,唯陆埋不会产生构造和析构。而如果是传值调用,调用时会进行构造,退出函数时会进行析构;
3 由于传引用使用的是原本实参的地址,所以对引用参数值的修改,会在退指蚂出函数后体现在主调函数中,而传值调用对参数的修改不会影响到主调函数。
B. 编译原理传地址问题
传址的话,这么讲你应该更明白,因为y(A):=x+y(1),y(1)=x+y(2),这时的y(2)才等于A,所以y:=x+x+y
C. 函数中传值跟传参的区别
一 函数中传值跟传参的区别主要是概念的区别:
传值, 是把实参的值赋值给行参。 那么对行参的修改,不会影响实参的值 。
函数定义中的参数是形式参数,函数的调用者提供给函数的参数叫实际参数轿亩蠢。
二 在数学中,一个函数是描述每个输入值对应唯一输出值的耐御这种对应关系,符号通常闭陪为f(x)。
D. c++三种传参方式(传值 && 传引用 && 传指针)
以STL容器的vector为例,当以升皮vector容器作为吵让差参数时,有三种传参方式:
1.func(vector<int> vec),传值
2.func(vector<int> &vec),传引用
3.func(vector<int> *vec),传指针
三种方滑纳式对应的调用形式分别为:
1.func(vec),传入值
2.func(vec),传入引用
3.func(&vec), 传入地址
E. java传参是传值还是传引用
当参数类型是基本类型,复制的是值,而当参数是引用类型时宽笑,复制的也是值,只不过这个值是地址。如下例调用change(A a)有几个过程:
(1)创建一个临时变量
(2)将实参的值复制给临时变量,由于是引用变量,实参的值是一个地址,故存的也是同一个地址
(3)方法中改变了临时变量所激槐指向的地址,而实参指向的地址没变
change(String str)同理,改变的是临时变量所指向的地址,实参指向的地址没变。
public Demo
{
public static void main(String[] args)
{
A a = new A();
System.out.println(a.x);//10
change(a);
System.out.println(a.x);//依然是10
}
public static void change(A a)
{
a = new A();
a.x = 20;
}
public static void change(String str)
{
str = "明巧友new string value in string pool";
//str = new String("new string in heap");
}
}
class A
{
public int x = 10;
}
F. C语言的传值和传址的区别
区别:对形参的影响不同
1、在誉改传值中函数参数压栈的是参数的副本,任何的修改是在副本上作用,没有作用在原来的变量上。
2、传址中压栈的是指针变量的副本,当你对指针解指针操作时,其值是指向原来的那个变量,所以对原来变量操作。
函数传参有三种传参方式:传值、传址、传引用。
1、按值传递
(1)形参和实参各占一个独立的存储空间。
(2)形参的存储空间是函数被调用时才分配的,调用开始戚虚歼,系统为形参开辟高冲一个临时的存储区,然后将各实参传递给形参,这是形参就得到了实参的值。
2、地址传递
地址传递与值传递的不同在于,它把实参的存储地址传送给形参,使得形参指针和实参指针指向同一块地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。
3、引用传递
引用传递是以引用为参数,则既可以使得对形参的任何操作都能改变相应数据,又使函数调用方便。引用传递是在形参调用前加入引用运算符“&”。
引用为实参的别名,和实参是同一个变量,则他们的值也相同,该引用改变则它的实参也改变。
G. 为什么在c语言中形参和实参之间传递的只能是值传递
其实c语言有猛芹两种形参和实参之间传值方式,一种是传值,枝镇毕一种是传这个值的地址,但实际上地址也是一个值,对应计算机存储空间上的编号,所以统称为旅州传值。
H. 编译原理问题,高手进。
回答下列问题:(30分)
(6分)对于下面程序段
program test (input, output)
var i, j: integer;
procere CAL(x, y: integer);
begin
y:=y*y; x:=x-y; y:=y-x
end;
begin
i:=2; j:=3; CAL(i, j)
writeln(j)
end.
若参数传递的方法分别为(1)传值、(2)传地址,(3)传名,请写出程序执行的输出结果。
答: (1) 3 (2) 16 (3) 16 (每个值2分)
(6分)计算文法G(M)的每个非终结符的FIRST和FOLLOW集合,并判断该文法是否是LL(1)的,请说明理由。
G(M):
M → TB
T → Ba |
B → Db | eT |
D → d |
解答:
计算文法的FIRST和FOLLOW集合:(4分)
FIRST(M) = { a,b,e,d, } FIRST(T) = { a,b,e,d, }
FIRST(B) = {b,e,d, } FIRST(D) = {d,}
FOLLOW (M) = {#} FOLLOW (T) = { a,b,e,d,#}
FOLLOW (B) = {a,# } FOLLOW (D) = { b}
检查文法的所有产生式,我们可以得到:
1. 该文法不含左递归,
2. 该文法中每一个非终结符M,T,B,D的各个产生式的候选首符集两两不相交。
3. 该文法的非终结符T、B和D,它们都有候选式,而且
FIRST(T)∩FOLLOW(T)={ a,b,e,d }≠
所以该文法不是LL(1)文法。(2分)
(4分)考虑下面的属性文法
产 生 式 语 义 规 则
S→ABC
A→a
B→b
C→c B.u := S.u
A.u := B.v + C.v
S.v := A.v
A.v :=3*A.u
B.v := B.u
C.v := 1
画出字符串abc的语法树;
对于该语法树,假设S.u的初始值为5,属性计算完成后,S.v的值为多少。
答:(1) (2分)
(2) S.v的值为18 (2分)
(4分)运行时的DISPLAY表的内容是什么?它的作用是什么?
答:DISPLAY表是嵌套层次显示表。每当进入一个过程后,在建立它的活动记录区的同时建立一张嵌套层次显示表diaplay.假定现在进入的过程层次为i,则它的diaplay表含有i+1个单元,自顶向下每个单元依次存放着现行层、直接外层、…、直至最外层(主程序,0层)等每层过程的最新活动记录的起始地址。通过DISPLAY表可以访问其外层过程的变量。
(5分)对下列四元式序列生成目标代码:
A:=B*C
D:=E+A
G:=B+C
H:=G*D
其中,H在基本块出口之后是活跃变量, R0和R1是可用寄存器。
答: 目标代码序列
LD R0 B
MUL R0 C
LD R1 E
ADD R1 R0
LD R0 B
ADD R0 C
MUL R0 R1
ST R0 H
(5分)写出表达式a+b*(c-d)对应的逆波兰式、三元式序列和抽象语法树。
答:
逆波兰式:(abcd-*+) (1分)
三元式序列: (2分)
OP ARG1 ARG2
(1) - c d
(2) * b (1)
(3) + a (2)
抽象语法树:(2分)
(8分)构造一个DFA,它接受={a,b}上所有包含ab的字符串。
答:
(2分)构造相应的正规式:(a|b)*ab(a|b)*
(3分)
a a
a b
b b
(3分)确定化:
I
{0,1,2} {1,2,3} {1,2}
{1,2,3} {1,2,3} {1,2,4,5,6}
{1,2} {1,2,3} {1,2}
{1,2,4,5,6} {1,2,3,5,6} {1,2,5,6}
{1,2,3,5,6} {1,2,3,5,6} {1,2,4,5,6}
{1,2,5,6} {1,2,3,5,6} {1,2,5,6}
b b
b a
a a a a
a b b
b
最小化:
{0,1,2} {3,4,5}
{0, 2},1, {3,4,5}
(6分)写一个文法使其语言为L(G)={anbncm| m,n≥1,n为奇数,m为偶数}。
答:
文法G(S):
(8分)对于文法G(S):
1. 写出句型b(Ma)b的最右推导并画出语法树。
2. 写出上述句型的短语,直接短语和句柄。
答:
1. (4分)
2. (4分)
短语: Ma), (Ma), b(Ma)b
直接短语: Ma)
句柄: Ma)
(12分)对文法G(S):
S → a | ^ | (T)
T → T,S | S
(1) 构造各非终结符的FIRSTVT和LASTVT集合;
(2) 构造算符优先表;
(3) 是算符优先文法吗?
(4) 构造优先函数。
答:
(1) (4分)
(2) (4分)
a ^ ( ) ,
a > >
^ > >
( < < < = <
) > >
, < < < > >
(3) 是算符优先文法,因为任何两个终结符之间至多只有一种优先关系。 (1分)
(4) 优先函数(3分)
a ^ ( ) ,
F 4 4 2 4 4
G 5 5 5 2 3
(8分)设某语言的do-while语句的语法形式为
S do S(1) While E
其语义解释为:
针对自下而上的语法分析器,按如下要求构造该语句的翻译模式,将该语句翻译成四元式:
(1) 写出适合语法制导翻译的产生式;
(2) 写出每个产生式对应的语义动作。
答:(1). 适合语法制导翻译的文法(4分)
G(S):
R do
UR S(1) While
SU E
(2). (4分)
R do
{ R.QUAD:=NXQ }
UR S(1) While
{ U.QUAD:=R.QUAD;
BACKPATCH(S.CHAIN, NXQ) }
SU E
{ BACKPATCH(E.TC, U.QUAD);
S.CHAIN:=E.FC }
答案二:
(1) S do M1 S(1) While M2 E
M ε (4分)
(2) M ε { M.QUAD := NXQ } (4分)
S do M1 S(1) While M2 E
{
BACKPATCH(S(1).CHAIN, M2.QUAD);
BACKPATCH(E.TC, M1.QUAD);
S.CHAIN:=E. FC
}
(10分)将语句
while C>0 do if A B=0 then C:=C+D else C:=C*D
翻译成四元式。
答:
100 (j>, C, 0, 102)
101 (j, -, -, 112)
102 (jnz, A, -, 106)
103 (j, -, -, 104)
104 (j=, B, 0, 106)
105 (j, -, -, 109)
106 (+, C, D, T1)
107 (:=, T1, -, C)
108 (j, -, -, 100)
109 (*, C, D, T2)
110 (:=, T2, -, C)
111 (j, -, -, 100)
112
(10分)设有基本块如下:
T1:=3
T2:=A*B
T3:=9+T1
M:=A*B
T4:=C-D
L:=T3*T4
T2:=C+D
N:=T2
画出DAG图;
设L,M,N 是出基本块后的活跃变量,请给出优化后的四元式序列。
答:
1. (6分)
L
*
T2,M T4 T2,N
* - +
T1 T3
3 A B 12 C D
2. (4分)
M:=A*B
S1:=C-D
L:=12*S1
N:=C+D
(8分)文法G(S)及其LR分析表如下,请给出串baba#的分析过程。
(1) S → DbB (2) D → d (3) D → ε
(4) B → a (5) B → Bba (6) B → ε
LR分析表
ACTION GOTO
b D a # S B D
0 r3 s3 1 2
1 acc
2 s4
3 r2
4 r6 S5 r6 6
5 r4 r4
6 s7 r1
7 S8
8 r5 r5
解答:
步骤 状态 符号 输入串
0 0 # baba#
1 02 #D baba#
2 024 #Db aba#
3 0245 #Dba ba#
4 0246 #DbB ba#
5 02467 #DbBb a#
6 024678 #DbBba #
7 0246 #DbB #
8 01 #S # acc
哈哈,估计认识!!
I. JavaScript 函数参数传递到底是值传递还是引用传递
JavaScript 函数参数传递到底是值传递还是引用传递
一 参数
1 所有的参数传递,都是传递值的拷贝。(如果想知道为什么,去学习编译原理的函数调用的参数压栈和出栈对应内容)。
2 C传指针进去,其实也是把这个指针值按拷贝传送进去。但是因为指针值指向一块外部内存空间(其实更多是堆空间,或外层栈变量空间),所以感觉可以在函数里改变外部变量。其实本质还是按拷贝传递,只是传递进去的是一个访问变量的渠道。
因此,如果我们希望函数内能改变外部的指针值,往往传进去的是指针变量的指针。呵呵,很多初学C的程序员,对**非常难理解。
二 返回值
返回值是按拷贝传递,函数出栈后,会传出一个值,该值在调用函数的代码段的生命周期里一直有效。相当与调用点形成一个匿名的栈变量。
变量a = function(); 而a并不等于函数里return的那个值。
其实function()执行结果自身就是一个匿名变量。(其实编译器会检查语法,如上面a=function这样的语法,匿名变量不会生成,直接使用a变量拷贝返回值)
例如: function()返回int值。 完全可以 int x = function() + 6;//注意:+运算时,函数已经执行完毕,所有函数出栈操作已经结束。
很明显function()必须有一个变量或常量参与计算,而函数里return的值会随函数调用结束出栈而被删除,所以必须拷贝构造传递出来。
J. Java中传参和传值的区别
传值拆做链就是你改变这个值,不会改变原值;
传引用就是你改变这个值,不会改变原值;
java方法基本数据类型是传值,对象类型传引用,这是千真万确的。
当参数是对胡闭象时,无论方法体内进行了何种操作,都不会改变实参对象的引用。
当参数是对象时,只有在方法内部改变了对象的内容时,才会改旅孙变实参对象内容。