主题:[讨论]Fortran 判断奇偶数?
			
 gulley
				 [专家分:10]  发布于 2010-08-06 18:29:00							
			要判断一个整数是奇数还是偶数,用fortran如何编写?
						
					 
		
			
回复列表 (共22个回复)
		
								
				21 楼
				
					
web81 [专家分:150]  发布于 2010-08-12 20:23:00				
				首先,我承认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 楼
				
					
cgl_lgs [专家分:21040]  发布于 2010-08-13 00:36:00				
				可能是我先学了汇编再学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兄的:)
							 
									
			
我来回复