| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 959 人关注过本帖
标题:&的一些疑惑
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
以下是引用吹水佬在2015-11-24 10:31:12的发言:

个人理解,&就是将一个字符串变成一个表达式(或表达式的一部份),关键是怎样去理解这个表达式,这样理解对否?
关键是怎样去理解这个表达式,这是关键说来说去如何去理介?难点是如何来理介呢?我要求的就是如何去理介?
2015-11-24 11:22
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
&a 能理解,那为什么 &cStr(i) 不能理解呢?这里的 cStr(i) 与 a 作用是相同的,都是用变量的字面值代替变量

泉城飞狐
2015-11-24 13:39
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用sylknb在2015-11-24 11:22:57的发言:

关键是怎样去理解这个表达式,这是关键说来说去如何去理介?难点是如何来理介呢?我要求的就是如何去理介?

动手试试不难理解:
bc = 123
aa = "bc"
? &aa
这个 &aa 就是将字符串"bc"(aa=="bc")变做表达式bc。
aa = "c"
? b&aa
这个 &aa 就是将字符串"c"(aa=="c")变做表达式bc的一部份。
两种方式都一样,相当于:
? bc

2015-11-24 14:43
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
宏替换,就是用表达式的值来替换表达式(或变量名)。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-11-24 15:39
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2214
专家分:3882
注 册:2007-4-27
收藏
得分:0 
这变量替换,与初中数学中解高次方程时的换元法是一样的道理

只求每天有一丁点儿的进步就可以了
2015-11-24 15:50
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:20 
楼主想多了。&是一个很简单的东西,它的作用就是仅仅把后面跟随的字符型变量中的内容原样替换出来而已,且仅此而已。至于替换出来能不能用,是程序猿自己要事先做的功课。下面举几个栗子:

 1、AB="1";?&AB+1 → 得到的结果为:2。
    分析:根据&仅仅起到把字符型变量中的内容原样替换出来的原理,“?&AB+1”相当于“?1+1”,所以结果等于2。

 2、AB(1)="1";?"AB&AB(1)" → 得到的结果为:AB1
    分析:结果中的“AB”是“AB&AB(1)”中&前的那个“AB”,而后面的“1”就是AB(1)被替换出来的结果。所以,连在一起输出就是“AB1”。

 3、接续栗子2:把 ?"AB&AB(1)" 改成 ?AB&AB(1),会得到一个出错信息:找不到变量‘AB1’。
    分析:栗子2中已经说到“AB&AB(1)”经过计算后,会得到“AB1”的结果。那为何栗子2可以输出这个结果,而到了这里却出错了呢?请注意:栗子2输出命令中是把AB&AB(1)放在一对双引号里的,也就是说,那条命令中的 AB&AB(1) 其实是一个字符串常量;而这个栗子中的AB&AB(1)没有套上双引号,因此会被当作变量对待。由于事先没有定义过AB1这个变量,也没有用任何赋值语句给这个变量赋过值,VFP就没有在内存中建立这个变量。此时,突然之间要输出这个变量的值,当然就会出错。

 4、接续栗子3:加一条命令 AB1=5,那么,?AB&AB(1) 就会得到结果:5。
    根据栗子3的分析,这个栗子中的结果不会有什么难以理解的地方了吧?

 5、再来个猛的,在日常编程中很可能会碰到。
    比如,有一个订单表要作统计,假设其中有三个字段:客户名称 V(50),订单编号 V(20),下单日期 D。需要按两种方式统计订单数(在操作窗口中选择):(1)每个客户的总订单数,也就是不分下单时段的订单总数;(2)每个客户在指定下单时段内的总订单数,需要设置日期的。
   IF 统计时间 THEN &&“统计时间”变量根据操作窗口中的勾选设定
      日期1="{^"+DTOC(起始日期)+"}"
      日期2="{^"+DTOC(终止日期)+"}"
      条件="下单日期 BETWEEN "+日期1+" AND "+日期2
   ELSE
      条件=".T."
   ENDIF
   SELECT 客户名称,COUNT(DISTINCT 订单编号) 订单数 ;
      FROM 订单表;
      WHERE &条件;
      GROUP BY 客户名称;
      INTO CURSOR T7
    分析:因为查询语句中的条件不是固定的,但整个查询的结构又一致,所以用IF...ELSE...ENDIF的分支语句配合宏替换来解决是比较方便的,不要分成两条或更多条的查询语句了。这样一来,代码看上去也比较简洁。这里的关键是那个红色的 条件=".T." 那句。为什么要加这一句呢?如果用户在操作窗口中勾选了不需要统计时间的选项,那么THEN后面的若干条语句便不会执行,也就是内存变量“条件”就没有建立。这时代码执行到查询语句,WHERE子句会因为找不到“条件”这个变量而出错。同样,也不能把“条件”变量的值设为空值("")。因为设为空值后,WHERE子句就只剩下一个关键字“WHERE”了,会造成语法错误。

    啰啰嗦嗦地说了辣么多,不知道楼主弄懂了宏替换没有。总之,一句话,宏替换就是简单地把字符串变量中的内容原样拿出来而已,你不要想得太多。


[此贴子已经被作者于2015-11-25 08:42编辑过]

2015-11-25 08:38
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
因为担心 where .t. 会降低 SQL 语句的性能,所以我一般用如下方式:

   IF 统计时间 THEN
      日期1="{^"+DTOC(起始日期)+"}"
      日期2="{^"+DTOC(终止日期)+"}"
      条件="WHERE 下单日期 BETWEEN "+日期1+" AND "+日期2
   ELSE
      条件=""
   ENDIF
   SELECT 客户名称,COUNT(DISTINCT 订单编号) 订单数 ;
      FROM 订单表;
      &条件;
      GROUP BY 客户名称;
      INTO CURSOR T7

泉城飞狐
2015-11-25 09:43
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
以下是引用taifu945在2015-11-25 08:38:54的发言:

楼主想多了。&是一个很简单的东西,它的作用就是仅仅把后面跟随的字符型变量中的内容原样替换出来而已,且仅此而已。至于替换出来能不能用,是程序猿自己要事先做的功课。下面举几个栗子:

 1、AB="1";?&AB+1 → 得到的结果为:2。
    分析:根据&仅仅起到把字符型变量中的内容原样替换出来的原理,“?&AB+1”相当于“?1+1”,所以结果等于2。

 2、AB(1)="1";?"AB&AB(1)" → 得到的结果为:AB1
    分析:结果中的“AB”是“AB&AB(1)”中&前的那个“AB”,而后面的“1”就是AB(1)被替换出来的结果。所以,连在一起输出就是“AB1”。

 3、接续栗子2:把 ?"AB&AB(1)" 改成 ?AB&AB(1),会得到一个出错信息:找不到变量‘AB1’。
    分析:栗子2中已经说到“AB&AB(1)”经过计算后,会得到“AB1”的结果。那为何栗子2可以输出这个结果,而到了这里却出错了呢?请注意:栗子2输出命令中是把AB&AB(1)放在一对双引号里的,也就是说,那条命令中的 AB&AB(1) 其实是一个字符串常量;而这个栗子中的AB&AB(1)没有套上双引号,因此会被当作变量对待。由于事先没有定义过AB1这个变量,也没有用任何赋值语句给这个变量赋过值,VFP就没有在内存中建立这个变量。此时,突然之间要输出这个变量的值,当然就会出错。

 4、接续栗子3:加一条命令 AB1=5,那么,?AB&AB(1) 就会得到结果:5。
    根据栗子3的分析,这个栗子中的结果不会有什么难以理解的地方了吧?

 5、再来个猛的,在日常编程中很可能会碰到。
    比如,有一个订单表要作统计,假设其中有三个字段:客户名称 V(50),订单编号 V(20),下单日期 D。需要按两种方式统计订单数(在操作窗口中选择):(1)每个客户的总订单数,也就是不分下单时段的订单总数;(2)每个客户在指定下单时段内的总订单数,需要设置日期的。
   IF 统计时间 THEN &&“统计时间”变量根据操作窗口中的勾选设定
      日期1="{^"+DTOC(起始日期)+"}"
      日期2="{^"+DTOC(终止日期)+"}"
      条件="下单日期 BETWEEN "+日期1+" AND "+日期2
   ELSE
      条件=".T."
   ENDIF
   SELECT 客户名称,COUNT(DISTINCT 订单编号) 订单数 ;
      FROM 订单表;
      WHERE &条件;
      GROUP BY 客户名称;
      INTO CURSOR T7
    分析:因为查询语句中的条件不是固定的,但整个查询的结构又一致,所以用IF...ELSE...ENDIF的分支语句配合宏替换来解决是比较方便的,不要分成两条或更多条的查询语句了。这样一来,代码看上去也比较简洁。这里的关键是那个红色的 条件=".T." 那句。为什么要加这一句呢?如果用户在操作窗口中勾选了不需要统计时间的选项,那么THEN后面的若干条语句便不会执行,也就是内存变量“条件”就没有建立。这时代码执行到查询语句,WHERE子句会因为找不到“条件”这个变量而出错。同样,也不能把“条件”变量的值设为空值("")。因为设为空值后,WHERE子句就只剩下一个关键字“WHERE”了,会造成语法错误。

    啰啰嗦嗦地说了辣么多,不知道楼主弄懂了宏替换没有。总之,一句话,宏替换就是简单地把字符串变量中的内容原样拿出来而已,你不要想得太多。
谢谢!回答如此详细。1)我问的的数组cstr(i)为什么前面加了&它可以形成一个表达式?假如I=1为“_ls",kc&cstr(i)--->kc_ls
2)字段函数fields(i)为什么前面不能用&fields(i),一定要用a=fields(i)然后再用&a
3)前面你的列子中2、AB(1)="1";?"AB&AB(1)" → 得到的结果为:AB1 在命令窗口不能运行?


[此贴子已经被作者于2015-11-25 12:04编辑过]

2015-11-25 12:00
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
数组与函数不能混为一谈。cStr(i) 是一个数组,是一个变量,而 fields(i)是一个函数。看来要当好一个老师还真不容易啊。

泉城飞狐
2015-11-25 13:37
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用liuxingang28在2015-11-25 09:43:24的发言:

因为担心 where .t. 会降低 SQL 语句的性能,所以我一般用如下方式:
 
   IF 统计时间 THEN
      日期1="{^"+DTOC(起始日期)+"}"
      日期2="{^"+DTOC(终止日期)+"}"
      条件="WHERE 下单日期 BETWEEN "+日期1+" AND "+日期2
   ELSE
      条件=""
   ENDIF
   SELECT 客户名称,COUNT(DISTINCT 订单编号) 订单数 ;
      FROM 订单表;
      &条件;
      GROUP BY 客户名称;
      INTO CURSOR T7
有道理,学习了。
2015-11-25 13:57
快速回复:&的一些疑惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041283 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved