`
yiminghe
  • 浏览: 1461857 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Math.PI 相关表达式运算

阅读更多

一段不算太新,流传网络的代码:

 

var a = (++Math.PI); 
alert(a); //1
alert(Math.PI); //2

var b = (Math.PI++); 
alert(b); //3
alert(Math.PI); //4

var c = Math.PI = (++Math.PI); 
alert(c); //5
alert(Math.PI); //6


var d = Math.PI = (Math.PI++); 
alert(d); //7
alert(Math.PI); //8


var e = Math.PI = (Math.PI + 1);
alert(e); //9
alert(Math.PI); //10

 

 

Math.PI 在其他语言看来是系统一个常量,修改它的话编译都通不过,不过 javascript 具有很强的的容错性(包容性?),他是不会提醒你的,要搞懂这个不看规范是不行的。

 

分析

 

ECMAScript 262 :

 

PI

 

15.8.1.6 PI
The number value for π, the ratio of the circumference of a circle to its diameter, which is approximately 3.1415926535897932.
This property has the attributes { DontEnum, DontDelete, ReadOnly }.


只有系统属性才会有 readonly ,我们定义的一般属性没法设置, 而 ReadOnly 应该相当于常量了吧 ?


ReadOnly


8.6.1 ReadOnly
The property is a read-only property. Attempts by ECMAScript code to write to the property will be ignored. (Note, however, that in some cases the value of a property with the ReadOnly attribute may change over time because of actions taken by the host environment; therefore “ReadOnly” does not mean “constant and unchanging”!)


看见一般情况下,readonly属性不可以改,但不报错,即赋值修改没用!也不意味着是常量 !


那么现在知道了 : 2,4,6,8,10 条代码 alert 都是 3.14 了。


另外 3 alert 也不用解释了,返回自增前结果,还是 3.14


那么 1 alert 难道还是 3.14 ,因为 PI readonly 无法改变 ?错误

 

 

自增运算符

 

 

涉及到 前缀自增运算符的返回值问题 :


11.4.4 Prefix Increment Operator The production UnaryExpression :


++ UnaryExpression is evaluated as follows:
1.    Evaluate UnaryExpression.

2.    Call    GetV alue(Result(1)).

3.    Call ToNumber(Result(2)).

4.    Add the value 1 to Result(3), using the same rules as for the + operator (see 11.6.3).

5.    Call    PutV alue(Result(1),    Result(4)).
6.    Return Result(4).


则可见返回的是  Result(4) Math.PI+1 ,而不是 第五步过后的 Result (1)


那么可见 1 alert 即为 Math.PI+1 = 4.14


 

 

赋值操作符

 

c,d,e 类似,= 操作符具有右结合性, 则申明初始化时,变量值为赋值表达式 (Math.PI = ++Math.PI) ,javascript 每个表达式都会返回一个值,这就涉及到了前句的表达式返回值是多少:


11.13.1    Simple Assignment ( = )


The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression is evaluated as follows:
1.    Evaluate LeftHandSideExpression.

2.    Evaluate AssignmentExpression.

3.    Call    GetV alue(Result(2)).

4.    Call    PutV alue(Result(1),    Result(3)).
5.    Return Result(3).


前面自增规范可以得到 ++Math.PI 返回 4.14 为 Result 2,Result 3 ,同样的道理,第4步赋值后,返回的是赋值表达式右端的值 (++Math.PI),而不是左端的值 Math.PI ,则  (Math.PI = ++ Math.PI) 返回 ++Math.PI == 4.14 ,即连续赋值运算只返回最右边的值,而不管赋值中变量是否发生了变化。

 

 

 

 

 

 

 

 

2
0
分享到:
评论

相关推荐

    面试题: Java Math类常见的数学运算和用法

    Java Math类是Java标准库中的一个关键组成部分,它为开发者提供了丰富的数学运算功能。这个类包含了一系列静态方法,使得在编程过程中处理数学计算变得简单易行。以下是对Java Math类中一些重要方法的详细说明: 1....

    C#中math类的全部运算方法(总结)

    在C#编程语言中,`Math`类是一个非常重要的实用工具类,提供了各种数学运算方法。这个类位于`System`命名空间下,包含了处理基本数学运算、三角函数、指数和对数、取整以及随机数生成等所需的功能。下面是对`Math`类...

    详解Python中用于计算指数的exp()方法

    print("math.exp(math.pi) : ", math.exp(math.pi)) ``` 当运行上述代码时,你会得到以下输出: ``` math.exp(-45.17) : 2.41500621326e-20 math.exp(100.12) : 3.03084361407e+43 math.exp(100.72) : 5....

    Python基础教程详解(第五十三课)——数学运算.pdf

    `math.pi`代表圆周率π,其值约为3.141592...,在几何和圆形相关计算中经常用到。而`math.e`则是自然常数,大约等于2.718281...,在复利计算和指数函数中扮演关键角色。 接下来,我们来看看`math`模块提供的数值...

    Python陈东

    - `math.log()` 计算自然对数,`math.log(math.sqrt(13+math.e)*2*math.pi)` 计算了给定表达式的自然对数。 - `math.pow()` 用于计算幂次,`math.pow(math.tan(math.log(math.pi+1,3)),-1)` 计算了 tan(log(π + 1...

    c# 表达式(公式)计算

    3. **内置数学函数**:C#提供了许多内置的数学函数,如`Math.PI`、`Math.Abs`、`Math.Pow`、`Math.Round`和`Math.Sqrt`等,可以用于计算。 4. **自定义函数**:除了内置函数,还可以定义自己的函数并集成到表达式...

    简介JavaScript中Math.LOG10E属性的使用

    这个属性提供了一种方便的方式来计算与10为底的对数相关的数学表达式,而无需手动计算或查找E(自然对数的底,约等于2.71828)对10的对数值。 `Math.LOG10E`的值约等于0.4342944819032518,这是一个浮点数,精确到...

    c#计算器rar

    double tangent = Math.Tan(Math.PI / 4); // 正切 ``` 在设计科学计算器的UI时,你可能需要增加更多按钮来表示科学计算的功能,并提供切换到科学模式的选项。此外,还要考虑处理错误,比如除以零或计算无效的数学...

    Java课后习题答案.pdf

    Math.cos(Math.PI*x/2) : - Math.cos(Math.PI*x/2); ``` 在 Java 语言中,前缀 ++ 和后缀 ++ 的区别,在于前缀 ++ 是先加 1,然后赋值,而后缀 ++ 是先赋值,然后加 1。 可以编写一个程序来示意前缀 ++ 和后缀 ++...

    lua 参考手册

    表达式包括了算术运算、位操作、强制类型转换、比较运算、逻辑运算、字符串连接、取长度、优先级等。语句类型包括语句块、代码块、赋值、控制结构(如if-then-else, while循环)、For循环、函数调用、局部声明等。...

    JavaScript_这个科学计算器是一个免费的工具,通过支持几个内置函数来解决复杂的数学表达式.zip

    `Math.sin(angle)`、`Math.cos(angle)`和`Math.tan(angle)`分别用于计算角度的正弦、余弦和正切值,其中角度以弧度为单位,可以使用`Math.PI`常量转换角度和弧度。 2. **科学计数法**: JavaScript的Number类型可以...

    自考JAVA语言程序设计(一)课后习题答案和源代码(第二章).pdf

    5. 复杂函数:`y = Math.sin(x) / a * x + Math.abs(Math.cos(Math.PI * x / 2));` 6. 逻辑条件:`a > 0 && a 7. 逻辑条件:只有一个条件成立(x=1 或 y=2,但不能同时成立):`(x == 1 && y != 2) || (x != 1 && y...

    谷歌计算器

    `Math.PI`常量可以用来与弧度进行关联,而`Math.radians`和`Math.degrees`函数可以用于单位转换。 7. **性能优化**:为了提供流畅的用户体验,计算器的代码需要优化,避免不必要的计算,减少内存占用,并确保响应...

    python语言程序设计(刘卫国)实验指导_部分答案.doc

    Python的math库提供了π的常量math.pi,所以计算π的平方可以通过`math.pi * math.pi`实现。补充完整程序如下: ```python import math p = math.pi * math.pi print(p) ``` 实验2:顺序结构程序设计 实验2主要...

    JAVA课后习题答案

    Math.cos(Math.PI*x/2) : -Math.cos(Math.PI*x/2); - 0<a<10 -> a > 0 && a ; - 条件 x=1 与 y=2 有且只有一个成立 -> (x == 1 && y != 2) || (x != 1 && y == 2); 10. **变量运算后的值** - 表达式1:b=a*a++...

    实验02 运算符、表达式及数字类型操作.docx

    球的表面积公式为\(4\pi r^2\),体积公式为\(\frac{4}{3}\pi r^3\),其中r为球的半径,π可通过`math.pi`获得。例如: ```python import math radius = float(input("请输入球的半径: ")) surface_area = 4 * math...

    VB.NET示例(一些小例子大家看看)

    5. **数学对象应用**:VB.NET中的`Math`类提供了一系列数学函数,如`Sqrt`(平方根)、`Pow`(幂运算)、`Ceiling`(向上取整)等。例如,`Dim result = Math.Sqrt(16)`将返回4。 6. **类型转换函数**:VB.NET提供...

    Python的math模块中的常用数学函数整理

    Python的math模块是Python标准库中的一个重要组成部分,它提供了丰富的数学...同时,math模块的使用也遵循Python的运算符优先级规则,例如`**`运算符的优先级高于乘法和除法,这在编写涉及多个运算的表达式时尤为重要。

    JAVASCRIPT对象与函数[文].pdf

    JavaScript的`Math`对象提供了一系列数学运算相关的函数和属性。三角函数如`Math.sin()`, `Math.cos()`, `Math.tan()`分别计算正弦、余弦和正切值;反三角函数如`Math.asin()`, `Math.acos()`, `Math.atan()`则用于...

    JAVA习题[参考].pdf

    - `Math.PI` 是Java中预定义的常量,表示π的近似值。 8. **格式化输出**: - 实验3的第二部分使用了 `DecimalFormat` 类来格式化输出结果,确保显示两位小数,使结果更加美观。 9. **条件判断**: - 虽然实验3...

Global site tag (gtag.js) - Google Analytics