回 帖 发 新 帖 刷新版面

主题:[讨论]Fortran 判断奇偶数?

要判断一个整数是奇数还是偶数,用fortran如何编写?

回复列表 (共22个回复)

21 楼

首先,我承认asymptotic的写法要可靠的多,因该提倡。
其次,在intel fortran中,默认判断整数转化规则应该是判断数值是否为0,非0值都转化为.True.,为0时转化为 .False.。 如果如20楼所说的依据最后一个 bit 对应 指来判断,那么转换结果因该是偶数为.False.,奇数为.True.。
执行下面的程序,除了输入0以外,全部都有输出值。
program a
implicit none
integer:: i
read(*,*)i
if (i.ne. .false.) write(*,*)i
end program

22 楼

可能是我先学了汇编再学C后来自学C++和FORTRAN的缘故吧。
我没有两位的好习惯——看帮助看标准。

但我喜欢看反汇编,偶尔也看看帮助或标准。
对于隐式转换的问题,我不妨用C++做一个例子吧。
在C++标准里规定为:非0则是真。
故:
if(a%b)

if((a%b)!=0)
以及
if(((a%b)!=0)==true)
是等效的,且第二者更好维护,第三个却太过囉嗦。
它们的汇编代码是完全一样的。(第一个式子就是在编译期有一个隐式转换,将整型转成了逻辑型)

但是:
if((a%b)==true)却与上面的代码不等效!
原因是:
非0虽为真,但它不一定与true是相等的!且true对应int到底是什么值也是编译器厂商来定的,有的是1有的就是-1~~~
故在我维护的工程里我绝对禁止出现类似的代码或是将bool类型的变量加1或减1等操作~~~~

asymtotic兄喜欢引经据典,但他并没有扁低他人的意思,他只是对事严谨而已:)

web81兄喜欢用编译器的运行结果说话,但那毕竟是“方言”,有时在我们需要移植代码时,“方言”会害死人,故还是谨慎为好:)当然,也能看出您也是非常爱钻研的人——毕竟你也看了帮助文档,也找到了一些证据性的东西吧:)

对于编译期的隐式转换,我支持web81兄的想法:它是不占“程序运行时”的时间的,而对于编程风格我绝对是支持asymtotic兄的:)

我来回复

您尚未登录,请登录后再回复。点此登录或注册