Spa*_*Dog 136 c integer objective-c literals
在Apple创建的代码中,有这一行:
CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
Run Code Online (Sandbox Code Playgroud)
没有任何理由来表达1,000,000,000的1000*1000*1000?
为什么不1000^3呢?
Pio*_*ski 195
以乘法方式声明常量的一个原因是提高可读性,而运行时性能不受影响.此外,表明作者正在以数字的乘法方式思考.
考虑一下:
double memoryBytes = 1024 * 1024 * 1024;
Run Code Online (Sandbox Code Playgroud)
它显然比以下更好:
double memoryBytes = 1073741824;
Run Code Online (Sandbox Code Playgroud)
因为后者乍一看不是1024的第三个力量.
正如Amin Negm-Awad所提到的,^运算符是二进制的XOR.许多语言缺少内置的编译时取幂运算符,因此乘法.
Ami*_*wad 72
为什么不
1000^3呢?
结果1000^3是1003. ^是bit-XOR运算符.
即使它没有处理Q本身,我补充说明.x^y也不能总是为x+y,因为它在提问的例子.你必须xor每一点.在示例的情况下:
1111101000? (1000??)
0000000011? (3??)
1111101011? (1003??)
Run Code Online (Sandbox Code Playgroud)
但
1111101001? (1001??)
0000000011? (3??)
1111101010? (1002??)
Run Code Online (Sandbox Code Playgroud)
chu*_*ica 66
有理由不使用1000 * 1000 * 1000.
随着16位int,1000 * 1000溢出.因此使用1000 * 1000 * 1000降低了可移植性.
对于32位int,以下溢出.
long long Duration = 1000 * 1000 * 1000 * 1000; // overflow
long long Duration = 1000000000000; // no overflow, hard to read
Run Code Online (Sandbox Code Playgroud)
建议前导值与目标类型匹配,以提高可读性,可移植性和正确性.
double Duration = 1000.0 * 1000 * 1000;
long long Duration = 1000LL * 1000 * 1000 * 1000;
Run Code Online (Sandbox Code Playgroud)
也可以简单地使用e符号表示可以完全表示为的值double.当然,这会导致知道是否double可以准确地表示整数值 - 值大于1e9的值.(见DBL_EPSILON和DBL_DIG).
long Duration = 1000000000;
// vs.
long Duration = 1e9;
Run Code Online (Sandbox Code Playgroud)
Tam*_*ola 50
为了便于阅读.
在零(1 000 000 000或1,000,000,000)之间放置逗号和空格会产生语法错误,并且1000000000在代码中很难确切地看到有多少个零.
1000*1000*1000很明显它是10 ^ 9,因为我们的眼睛可以更容易地处理块.此外,没有运行时成本,因为编译器将使用常量替换它1000000000.
dje*_*lin 25
为了便于阅读.为了进行比较,Java支持_数量以提高可读性(首先由Stephen Colebourne提出,作为对Derek Foster的PROPOSAL: Project Coin/JSR 334的Binary Literals的回复).有人会写1_000_000_000在这里.
大致按时间顺序,从最旧的支持到最新的支持:
"(1)1111 1111"(显然不是对十进制值,仅用于表示二进制,quartal,八进制或十六进制值位串)1$000$0001_000_000_0001'000'000'000这是一种相对较新的功能,语言实现它们应该支持(然后是Perl).正如chux @的优秀答案一样,1000*1000...是一个部分解决方案,但即使最终结果是一个大类型,也会使程序员打开溢出乘法的错误.
可能更容易阅读并获得与1,000,000,000表单的一些关联.
从技术方面来说,我猜直接数或乘法没有区别.无论如何,编译器将生成为十亿亿的数字.
如果你谈论objective-c,那么1000^3就行不通,因为pow没有这样的语法(它是xor).相反,pow()可以使用功能.但在这种情况下,它将不是最优的,它将是运行时函数调用而不是编译器生成的常量.
| 归档时间: |
|
| 查看次数: |
12700 次 |
| 最近记录: |