|
Why limit it to today?
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Because we don't want him to stop posting his thoughts of the day... we need this... our precious.
Jeremy Falcon
|
|
|
|
|
Just to expand on Richard's point...
I'm more of a C guy than C#, but like with C/C++ I can only assume that in this case, the compiler is doing a binary operation of AND, and 1 (or any non-zero) AND 0 is always going to be zero, which is expressed as false in this case. It's the difference between a bitwise operator and a logical one.
Jeremy Falcon
|
|
|
|
|
That's why C# didn't adopt the C convention that any non-zero value is true: you can't treat an integer as a boolean directly.
Hence why I assumed that the compiler would complain, it does with
if (myInt = 6)
... because an integer isn't a boolean value
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Oh I hear ya man. I reckon the difference being the compiler knows that's an assignment operator. My understanding of the way C# and Java does things is to create an object where needed from literals / constants / expressions. So, it would be more like this...
"Hello, world!".ToUpper()
...just instead of a string it's a false... which gets treated like a boolean.
Jeremy Falcon
|
|
|
|
|
Jeremy Falcon wrote: I reckon the difference being the compiler knows that's an assignment operator.
Nope, it's because both C# and Java are more type safe (strong typed) than C is. In this case they define a boolean type, C just interprets an integer to have similar "meaning" to a boolean. And the if statement (in C#/Java) requires a boolean input argument. It's the same sort of situation as sending a string into a function which expected a float - compiler error - wrong type.
This is an example of where C uses a weak typing system. It generally just uses the raw data as if it's in the expected type. Effectively turning it into a raw type-cast. The more strongly typed languages disallow most of these, probably because they tend to be the reason behind lots of bugs (if not most).
|
|
|
|
|
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
At the same time C# is too rigid, especially with data which may have to be taken as raw (like a read from another process' memory) and read differently depending on other circumstances. I had to develop a C# plugin for VS that allowed me to visualize 8 bits or 16 bits grayscale images taken from the memory of a debugged process, either completely raw with parameters (height, width, bitsperpixel) inserted manually or taken from a standard structure we use in our codebase, which was stored in memory. Doing the necessary casts was freaking tough and required craptons of code and workarounds, while with C it would have been immediate.
I prefer the need of more attention of C towards the need of knowing a stupid framework as with .NET languages - a poorly documented framework BTW since while every method and object is documented there isn't single piece of documentation explaining WEHN to use a particular namespace/object instead of a similarly named one, which are the related structures/objects/methods... compare that to Win32 APIs documentation.
CALL APOGEE, SAY AARDWOLF
GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++* Weapons extension: ma- k++ F+2 X
If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver
"Go ahead, make my day"
|
|
|
|
|
I find the strong typing of C# is more of a help than a hindrance.
Back in my C days I would get into horrible tangles doing precisely what you are trying to do.
An int is not a bool even though many programmers of the era would treat them alike. I still encounter data tables that have integers or even strings used as boolean values and it makes my skin crawl.
We're philosophical about power outages here. A.C. come, A.C. go.
|
|
|
|
|
Remember that C was designed to replace assembly. Common assembly directives are things like "Branch if equal to 0", "Branch if not equal to 0", etc.
No Booleans in assembly.
In C, a string "abc" is really just the address of the letter 'a' in memory.
So it is not really a "boolean",
You are just asking the compiler is the address NULL (0) or not.
char * str1 = "abc";
char * str2 = NULL; // #define NULL 0
if (str1) { /* will execute / }
if (str2) { / will NOT execute */ }
|
|
|
|
|
Sometimes the assumption makes code shorter but definetely not faster (optimizars take away all the fun) or elegant. In fact I stopped using them interchangeably a while ago, now I use integers as bools only when marshalling between different conventions or storing in exchangeable data structures - it allows me to fix the size of the data field without stumbling in the differences of bool type size between compilers and languages.
CALL APOGEE, SAY AARDWOLF
GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++* Weapons extension: ma- k++ F+2 X
If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver
"Go ahead, make my day"
|
|
|
|
|
Don't get me wrong ... I'm not dissing on C and saying C# is all that great. I was simply pointing out why the if statement would fail to even compile in this particular case when trying this in C#.
You make a point where C#'s strong typing does make a programmer's life more cumbersome - you'd need to convert a byte array into specific types to do what you want, though there is readily available built-in libraries for that, or you could use an unsafe code block and use pointers to cast one into the other (just like you'd have done in C). Point is it would make for more coding to achieve the same thing.
Though it's only in special circumstances (like your example) where this is beneficial. Nearly everywhere else it means there's less to think about (and guard against) due to the compiler checking types for you. If you find you constantly run into situations where you need to cast between types - then perhaps C# isn't the correct tool for the job and you'd be better off with C instead.
|
|
|
|
|
I didn't get you wrong, neither I was dissing C# - each task has its tool for the job. For a graphical interface I would most definetely use C# (now I'm stuck to VB6 due to company decisions), and for almost any program. My job involves both hardware control and computation/memory heavy algorithms so C/C++ is the tool of excellence as of now.
CALL APOGEE, SAY AARDWOLF
GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++* Weapons extension: ma- k++ F+2 X
If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver
"Go ahead, make my day"
|
|
|
|
|
Processing OSC packets (for example) is a doddle in C/C++ but somewhat cumbersome in C#
|
|
|
|
|
Makes sense.
Jeremy Falcon
|
|
|
|
|
No, it's the use of an int as a boolean that C# complains about. The assignment in the if() is fine, provided it's a boolean:
bool x = false;
if (x = true)
"It's True".Dump();
Truth,
James
|
|
|
|
|
the integer is not a boolean, but the "success" of the value assignment can be taken as a bool
I have had problems with that several times in my career. That's why I got used to put constants in first place.
if (6 = myInt) is going to throw an error in many more cases as the other possibility.
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
Rating helpful answers is nice, but saying thanks can be even nicer.
|
|
|
|
|
Precisely, since I'm using both in the same code (hw management) I made my Dumb Mistake Of The Day
CALL APOGEE, SAY AARDWOLF
GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++* Weapons extension: ma- k++ F+2 X
If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver
"Go ahead, make my day"
|
|
|
|
|
A massive recall of all existing code is being contemplated...
Warning: "|" is also not the same as "||".
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
Did I sort the "have I locked my car?" effect?
CALL APOGEE, SAY AARDWOLF
GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++* Weapons extension: ma- k++ F+2 X
If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver
"Go ahead, make my day"
|
|
|
|
|
OK, my turn to learn something new: What's Dump()?
|
|
|
|
|
Dump() is an extension method added to all objects within LinqPad. LinqPad is a tool which allows writing & compiling simple C# code snippets (plus a bunch of other things). (And the basic version is free: www.linqpad.com )
Truth,
James
|
|
|
|
|
|
It's an extension method provided by LINQPad[^].
EDIT: I'm sure James' response wasn't there when I posted this!
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
I'm sure James' response wasn't there when I posted this!
Well, at least you got the URL right....
Truth,
James
|
|
|
|