Talk:C (programming language)/Archive 11: Difference between revisions

Content deleted Content added
MalnadachBot (talk | contribs)
m Replaced obsolete font tags and reduced Lint errors. (Task 12)
Legobot (talk | contribs)
m Bot: Fixing lint errors, replacing obsolete HTML tags: <tt> (6x)
 
(2 intermediate revisions by 2 users not shown)
Line 12:
 
:::I think you're confusing "strongly typed" and "statically typed": those ''constraint violations'' that you mentioned are due to the static types of the variables you use. This static type check can be easily circumvented, even without casts. Example:
<sourcesyntaxhighlight lang=c>
int a;
float b;
Line 18:
float* q = p;
b = *q;
</syntaxhighlight>
</source>
:::This will compile without errors or warnings, making C a weakly typed language — a strongly typed one will either not allow this, or throw an exception at runtime. C can't even be strongly typed, because it has a weak type system and lacks any concept of "objects" and associated type information at runtime. By the way, I found an excellent explanation here: [http://stackoverflow.com/questions/430182/is-c-strongly-typed Is C strongly typed?]. [[User:Adrianwn|Adrianwn]] ([[User talk:Adrianwn|talk]]) 09:28, 30 December 2009 (UTC)
 
::::I'll concede the point, but it should be noted that those kinds of conversions are ''only'' allowed for conversions to and from void pointer values. Assigning a <ttcode>float</ttcode> value to a pointer, for example, is illegal. — [[User:Loadmaster|Loadmaster]] ([[User talk:Loadmaster|talk]]) 19:06, 1 January 2010 (UTC)
== websites can also be programmed in C ==
 
Line 43:
'''begin removed text'''<br/>
To this day, Boolean values are commonly represented by integers in C programs. The comparison operators ('<code> > </code>', '<code>==</code>', etc.) are defined to return a signed integer (<code>int</code>) result, either zero (for false) or nonzero (for true). The Boolean operators (&&, ||) and conditional statements (if, while) in C operate on integer values, with the same interpretation. For example, the following C code
<sourcesyntaxhighlight lang="c">
int t = (x > y);
if (t) { printf("True!\n");}
else { printf("False!\n"); }
</syntaxhighlight>
</source>
is equivalent to
<sourcesyntaxhighlight lang="c">
int t;
if (x > y) { t = -1; }
Line 55:
if (t != 0) { printf("True!\n"); }
else { printf("False!\n"); }
</syntaxhighlight>
</source>
 
However, since the C language standards allow the result of a comparison to be any non-zero value, the statement <code>if(t==1){...}</code> is not equivalent to <code>if(t){...}</code> or to <code>if(t!=0){...}</code>.
Line 62:
 
For convenience, many programmers and [[C header file]]s use C's [[typedef]] facility to define a Boolean type (which may be named <code>Boolean</code>, <code>boolean</code>, <code>bool</code>, etc.). The Boolean type may be just an alias for a numeric type like <code>int</code> or <code>char</code>. In that case, programmers often define also [[C preprocessor|macros]] for the true and false values. For example,
<sourcesyntaxhighlight lang="c">
typedef int bool;
#define FALSE 0
Line 70:
...
if (f) { ... }
</syntaxhighlight>
</source>
The defined values of the <code>TRUE</code> and <code>FALSE</code> macros must be adequate for the chosen Boolean type. Note that, on the now common [[two's complement]] computer architectures, the signed value <code>-1</code> is converted to a non-zero value (<code>~0</code>, the bit-wise complement of zero) when [[type casting|cast]] to an unsigned type, or assigned to an unsigned variable.
 
Another common choice is to define the Boolean type as an [[enumerated type]] (<code>enum</code>) allows naming elements in the language of choice. For example, the following code uses the English names FALSE and TRUE as possible values of the type ''boolean''. In this case, care must be taken so that the false value is represented internally as a zero integer:
<sourcesyntaxhighlight lang="c">
typedef enum { FALSE, TRUE } boolean;
...
Line 80:
...
if (b) { ... }
</syntaxhighlight>
</source>
 
Again, since a true result may be any non-zero value, the tests <code>if(t==TRUE){...}</code> and <code>if(t)</code>, which are equivalent in other languages, are not equivalent in C.
Line 100:
 
Original:
<sourcesyntaxhighlight lang="c">
printf("hello, world\n");
</syntaxhighlight>
</source>
Modify to:
<sourcesyntaxhighlight lang="c">
printf("%s", "hello, world\n");
</syntaxhighlight>
</source>
 
The '''"%s"''' must be included to avoid a [[Format string attack]]. Please, discuss... [[Special:Contributions/83.55.41.191|83.55.41.191]] ([[User talk:83.55.41.191|talk]]) 21:38, 1 January 2010 (UTC)
 
:After reading that article and a cursory glance at [http://julianor.tripod.com/bc/formatstring-1.2.pdf this], I believe the vulnerability is present only when you pass "unfiltered user input" directly to these functions as format strings, as in <ttcode>printf(buffer);</ttcode> where the string <ttcode>buffer</ttcode> gets its value during runtime by user input. In the case of "hello world\n", the simple string "hello world\n" is constant, doesn't contain harmful characters and cannot be altered by user input; so its safe. Instead of "hello world\n" were it the string "%s%s%s%s%s%s%s%s%s%s%s%s", the program would crash (this particular example is from the pdf linked above). --[[User:Zvn|Zvn]] ([[User talk:Zvn|talk]]) 22:36, 1 January 2010 (UTC)
 
:I have not read the linked page but the point is fairly obvious to hard core coders. There is clearly no problem with the current article, and I do not think we need be concerned with providing a full set of best practices, so I do not think any change is needed. [[User:Johnuniq|Johnuniq]] ([[User talk:Johnuniq|talk]]) 03:54, 2 January 2010 (UTC)
Line 132:
One text I read suggested a way to avoid this error: Keep a constant to the left of a variable. Whereas "if (3 == userChoice)" is just as good as "if (userChoice == 3)" for a comparison, using "if (3 = userChoice)" will always result in an assignment error. It's brilliantly simple . . . but I could never develop the habit of writing those expressions "backwards"! [[User:WHPratt|WHPratt]] ([[User talk:WHPratt|talk]]) 19:00, 29 December 2009 (UTC)
 
:Yes. While it's somewhat common in some circles to see expressions such as <ttcode>NULL</ttcode>&nbsp;<ttcode>==</ttcode>&nbsp;<ttcode>p</ttcode>, I personally find it hard to read, having a backwards literal reading to normal English logic (''"Null is equal to pointer p"'' instead of ''"Pointer p is null"''). Perhaps the article should have a sentence or two about this programming idiom. — [[User:Loadmaster|Loadmaster]] ([[User talk:Loadmaster|talk]]) 19:23, 29 December 2009 (UTC)
 
::The article should not attempt to cover programming style, or it would grow way too large. Also, such matters are disputable; for example, I agree that it is harder to read the "safer" form described by WHPratt above. Frankly, I know of no experienced C programmer who makes the cited mistake, so it's totally unnecessary to contort the natural form of expression. — [[User:DAGwyn|DAGwyn]] ([[User talk:DAGwyn|talk]]) 02:38, 13 May 2010 (UTC)
Line 237:
== "Hello world" example using puts() instead? ==
 
I think it makes more sense to use the <code>puts</code> function instead of <code>printf</code>, as the "\n" is not necessary. I have seen <code>printf</code> used in every example I can remember, however. Edit it if you think it's a good idea though. [[User:Flarn2005|'<FONTspan COLORstyle="color:blue;">[[User:Flarn2005|'''FL''</span>]][[User:Flarn2005/Esperanza|<fontspan colorstyle="color:green;">a</fontspan>]][[User:Flarn2005|<span style="color:blue;">''RN''']]</FONTspan>']][[User talk:Flarn2005|<fontspan colorstyle="color:red;">(talk)</fontspan>]] 03:25, 28 July 2010 (UTC)
: "Hello World" isn't intended as an optimized demonstration of the most efficient way of printing that string to the screen. It's just a standard way of showing a minimal program in a given language using the most common calls. A lot (and I mean A LOT) of people have dinked with the code. The way it is is the standard way that it's shown in all the C standard books. Leave it be. - [[User:Richfife|Richfife]] ([[User talk:Richfife|talk]]) 05:22, 28 July 2010 (UTC)
== Syntax highlighting in the examples ==
Line 249:
::"Consensus" is such a useful word! Simply mentioning it is sufficient to convince everyone that things should stay as they are. This even works when no real consensus exists, as can be seen by the regularly occuring discussions (remember that [[WP:VOTE|Wikipedia decisions are not made by popular vote]]). If anything, WP-wide there is a consensus that syntax highlighting ''should in fact be used'', as can be seen in every article about a programming language for which syntax highlighting is available.
::Since those discussions didn't lead to a consensus in the past, and since no one seems to be able to have the colors defined by the MediaWiki software changed, I propose another solution:
<sourcesyntaxhighlight lang="cpp">
long int SomeFunction();
/* int */ OtherFunction();
Line 265:
 
return test2;
}</sourcesyntaxhighlight>
::Since C is mostly a subset of C++, using C++ syntax highlighting works just fine, and it seems good enough for the C++ article. Opinions?
::On a related note: why was '''some_function ()''' changed to '''SomeFunction ()'''? This is rather unusual for C, so I suggest it should be changed back. – [[User:Adrianwn|Adrian Willenbücher]] ([[User talk:Adrianwn|talk]]) 06:33, 13 October 2010 (UTC)
Line 272:
::::That's a pretty weak argument for the following reasons:
:::::1) Highlighting the syntax doesn't pretend anything. After all, you could say the same about indentation (indentation is not part of the language definition), so the example should look like this in order to be not "dishonest":
<sourcesyntaxhighlight lang="text">
long int SomeFunction();
/* int */ OtherFunction();
Line 288:
 
return test2;
}</sourcesyntaxhighlight>
:::::Actually, those line breaks don't have any meaning for the program either, so they should be removed as well, together with redundant whitespace:
<sourcesyntaxhighlight lang="text">long int SomeFunction();/* int */OtherFunction();/* int */CallingFunction(){long int test1;register /* int */ test2;test1 = SomeFunction();if (test1 > 0)test2 = 0;elsetest2 = OtherFunction();return test2;}</sourcesyntaxhighlight>
:::::There, now we have removed everything which doesn't influence the semantics of the program. What a clear, informative example!
:::::2) As was mentioned before, just about every other programming language article uses syntax highlighting. Are you saying that those should be changed, too? If not, why is C different? – [[User:Adrianwn|Adrian Willenbücher]] ([[User talk:Adrianwn|talk]]) 14:16, 13 October 2010 (UTC)