免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3286 | 回复: 18
打印 上一主题 下一主题

请问一个奇怪的现象,关于print [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-16 15:31 |只看该作者 |倒序浏览
$i=100;
$k=($i++)*2;
print $k;

结果为200

$i=100
print ($i++)*2;

结果为100??

问题在于,为什么print ()后面的表达式没有被计算?

请达人们给解答一下,谢谢啦

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
2 [报告]
发表于 2005-11-16 15:35 |只看该作者
$i++,也就是后置自增,一般是当前行的其他运算完成之后,才运算的啊。

论坛徽章:
0
3 [报告]
发表于 2005-11-16 15:37 |只看该作者
我的问题在第二段代码
为什么输出以后没有乘二呢

论坛徽章:
0
4 [报告]
发表于 2005-11-16 15:45 |只看该作者
原帖由 philonis 于 2005-11-16 15:31 发表
$i=100;
$k=($i++)*2;
print $k;

结果为200

$i=100
print ($i++)*2;

结果为100??

问题在于,为什么print ()后面的表达式没有被计算?

请达人们给解答一下,谢谢啦



这个根据环境的不同而不同。print ($i++)*2这句位于print表达式的上下文里,表达式完了以后$i才会自增。请这样测试:

my $i=100;
print $i++,"n";
print $i,"n";

打印结果是100和101,也就是说print完了后$i才自增的。

论坛徽章:
0
5 [报告]
发表于 2005-11-16 16:17 |只看该作者
原帖由 af80 于 2005-11-16 15:45 发表



这个根据环境的不同而不同。print ($i++)*2这句位于print表达式的上下文里,表达式完了以后$i才会自增。请这样测试:

my $i=100;
print $i++,"n";
print $i,"n";

打印结果是10 ...


对阿,打印结果在自增之前,可是难道也在 *2 之前么?

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
6 [报告]
发表于 2005-11-16 17:29 |只看该作者
原帖由 philonis 于 2005-11-16 16:17 发表


对阿,打印结果在自增之前,可是难道也在 *2 之前么?



提示信息:

  1. ---------- Perl调试 ----------
  2. print (...) interpreted as function at D:varperlNoname1.pl line 10.
  3. Useless use of multiplication (*) in void context at D:varperlNoname1.pl line 10.
  4. 200100
  5. 输出完成 (耗时 0 秒) - 正常终止
复制代码


print (($i++) * 2);
则正常

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
7 [报告]
发表于 2005-11-16 17:32 |只看该作者
  1. 下面列出的函数有的在参数两边有括号,有的没有。(语法描述中省略括号)

  2. 如果你使用括号,一个简单的规则是 (偶尔会令人吃惊):如果是函数,没有优先级的问题;如果它是一个数组运算符或者一元运算符

  3. 那么就要考虑优先级。并且,函数两边的空白和 "(" 是不计算的--因此,有时候需要小心行事。看看下面的几个例子:

  4.     print 1+2+4;        # Prints 7.
  5.     print(1+2) + 4;        # Prints 3.
  6.     print (1+2)+4;        # Also prints 3!
  7.     print +(1+2)+4;        # Prints 7.
  8.     print ((1+2)+4);        # Prints 7.

  9. 前面说得似乎有点抽象,那么你在运行PERL时带上-w开关你将得到一些警告信息,您可以根据这些信息再体会一下。例如,上面的例子会产生如下信息:

  10.     print (...) interpreted as function at - line 1.
  11.     Useless use of integer addition in void context at - line 1.

  12. 有些函数根本不需要参数,因此工作方式和一元运算符和数组运算符都不同, time 和 endpwent算是两个典型吧. 如, time+86_400 实际上是time() + 86_400.

  13. 对于可以用在标量或者数组的上下文中的函数,非失败性的错误在标量环境下通常暗示返回了未定义的值或在数组环境下返回一个空的数组。

  14. 记住下面的重要原则:

  15. 没有规则和数组环境下的表达式的行为和他的标量环境的行为有关系,反之亦然。 这可能产生两种完全不同的情况。在标量环境下,每个运算符和函数决定怎样以最恰当的次序返回值。 有些运算符在数组环境下返回数组的长度.,有些运算符返回的一个元素,有些返回数组中的最后一个元素,有些返回成功执行的操作的语句数。通常,他们返回一些你需要的值,除非你需要连续性。

  16. 在标量环境下的命名数组在第一眼看上去时和在标量环境下的列表有很大的不同。 在标量环境下,你不能得到一个像(1,2,3) 的列表,因为在编译时,编译器是知道当前环境的,它将在那里产生标量的逗号运算符, 而不是用于分隔数组元素的逗号. 也就是说,它永远不会以一个数组开始。

  17. 一般说来, PERL中的函数对应相应的系统调用 (如 chown(2), fork(2), closedir(2), 等等.) 成功调用后返回真值,否则返回 undef , 下面将会提到。这一点和C的接口不一样,C中出错时将返回-1.但是也有几个例外,他们是 wait, waitpid, 和 syscall. 系统调用出错时出错信息将通过特殊变量$!返回。其他的函数则不会,除非发生意外。
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2005-11-16 17:36 |只看该作者
楚楚引的什么破书啊,越说越乱套。

论坛徽章:
0
9 [报告]
发表于 2005-11-16 17:38 |只看该作者
原帖由 philonis 于 2005-11-16 15:31 发表
$i=100;
$k=($i++)*2;
print $k;

结果为200

$i=100
print ($i++)*2;

结果为100??

问题在于,为什么print ()后面的表达式没有被计算?

请达人们给解答一下,谢谢啦


我想说一句,其实不要太在这个方面浪费时间!
C语言的标准中对于与++相结合的定义是十分模糊的,具体的结果是和具体的编译器相关的。写程序的时候尽量可以避免这样的问题!

perl中也是一样,其实你现在找到一个理解,也许只是错误的!我试图理解过很多次!

论坛徽章:
0
10 [报告]
发表于 2005-11-16 17:59 |只看该作者

  1. $i=100;
  2. print ($i++)*2;
  3. print "\n";
  4. print  2*($i++);
复制代码

兄弟们试试这段...


[ 本帖最后由 angleeye 于 2005-11-16 18:01 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP