>>>>Just encountered a bug in our software releated to the use of = when set exact is set to off.
>>>>
>>>>I Know I should be using == in those cases where comparing strings of different lenght, but just a small test made me wonder.
>>>>
>>>>Is there any reason I should not use == for any comparison in VFP? It seems to work for any datatype.
>>>>
>>>>Is there any gotcha using == as a standard?
>>>>
>>>>
>>>>Walter,
>>>
>>>Not that I am aware of, I know people who do that all the time in order to differentiate assignments from comparisons.
>>
>>Which I find a good argument in itself. I just wonder why it has taken me more thaw 20 years to draw that conclusion.
>
>It's definitely safer to use == where you need to rely on an exact comparison.
>
>My understanding is == is a little slower than =, and there can be speed/Rushmore optimization issues with indexes e.g. if you have a column MyCharCol that is indexed, and you have WHERE MyCharCol == "SomeValue" ... in a SELECT, ISTR it's not fully optimizable.
>
>So, safer but a little slower.
I did not look into rushmore and to be honest I'm not that concerned about that one. I'm not dealing with VFP databases 99% of the time.
As for speed. It does not matter AFAICS. The following program does not give me any indication (after running it 10 times) that it is slower. In fact if there is a difference it seems to slightly faster (up to 5%).
CLEAR
SET EXACT OFF
? "Non Equal values"
nVal1 = 1
nVal2 = 2
nSec = SECONDS()
FOR nT = 1 TO 1000000
nRet = nVal1 = nVal2
ENDFOR
? "numeric using = ",SECONDS() - nSec
nSec = SECONDS()
FOR nT = 1 TO 1000000
nRet = nVal1 == nVal2
ENDFOR
? "numeric using == ",SECONDS() - nSec
nVal1 = "MyVal1"
nVal2 = "MyVal2"
nSec = SECONDS()
FOR nT = 1 TO 1000000
nRet = nVal1 == nVal2
ENDFOR
? "String using == ",SECONDS() - nSec
nSec = SECONDS()
FOR nT = 1 TO 1000000
nRet = nVal1 = nVal2
ENDFOR
? "String using = ",SECONDS() - nSec
? "Equal values"
nVal1 = 1
nVal2 = 1
nSec = SECONDS()
FOR nT = 1 TO 1000000
nRet = nVal1 = nVal2
ENDFOR
? "numeric using = ",SECONDS() - nSec
nSec = SECONDS()
FOR nT = 1 TO 1000000
nRet = nVal1 == nVal2
ENDFOR
? "numeric using == ",SECONDS() - nSec
nVal1 = "MyVal1"
nVal2 = "MyVal1"
nSec = SECONDS()
FOR nT = 1 TO 1000000
nRet = nVal1 == nVal2
ENDFOR
? "String using == ",SECONDS() - nSec
nSec = SECONDS()
FOR nT = 1 TO 1000000
nRet = nVal1 = nVal2
ENDFOR
? "String using = ",SECONDS() - nSec