Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > const and 'constant expression'

Reply
Thread Tools

const and 'constant expression'

 
 
Default User
Guest
Posts: n/a
 
      04-19-2006
Kenneth Brody wrote:

> Isn't this legal?
>
> ==========
>
> #include <stdio.h>
>
> const int a = 10;


> int *pt = (int *)&a;


> It fails here, at runtime, but only because "a" has been placed into
> read-only memory on this platform. But it's perfectly "legal" C, as
> far as I know. It compiles without even a warning about "pt" and "a",
> even with maximum warnings turned on.


What do you mean by "legal"? It doesn't require a diagnostic, but it's
undefined behavior.



Brian
 
Reply With Quote
 
 
 
 
devdatta_clc@yahoo.com
Guest
Posts: n/a
 
      04-19-2006
Marc Boyer wrote:
> Le 19-04-2006, http://www.velocityreviews.com/forums/(E-Mail Removed) <(E-Mail Removed)> a écrit :
> > Thanks Marc, point noted.
> >
> > Now getting back to my example,
> >
> > const int a = 10;
> >
> > In this case, can value of 'a' change?

>
> Not to my knowledge.
>
> > If so how?
> > If not, why can not variable 'a' be treated a compile time constant.

>
> It 'can' in this case. But, just try to explain in wich case
> it can and when it can not....



My bad. I did not include complete text.
Let me include enough context and repost.

~> cat test.c
const int a = 10;
int main () {
static int b = a;
return b;
}

If the compiler can treat this 'a' as a compile time constant then this
should also compile.

~> cat test2.c
const int size = 5;
int array[size];
int main() {
return 0;
}

But seems like it does not compile even with optimization turned on.
This is causing confusion. In one case, it compiles test.c with
optimisation.
In another case, it does not compile test2.c

Appreciate your patience,
-Dev
PS I'm aware of volatile const and VLA but that's a different topic.
I'm not using both here.

 
Reply With Quote
 
 
 
 
Jack Klein
Guest
Posts: n/a
 
      04-20-2006
On 19 Apr 2006 07:22:03 -0700, (E-Mail Removed) wrote in
comp.lang.c:

> Hi C experts
>
> I've a bunch of questions.
>
> Consider this simplified piece of code.
>
> const int a = 10;
>
> int main () {
> static int b = a;
> return b;
> }
>
> ~>gcc test.c
> test.c: In function `main':
> test.c:4: error: initializer element is not constant
> ~>
>
> Question1
> I understand that const is 'read-only' but I could not convince my
> co-worker that its value can change.


No strictly conforming program can change its value. Whether or not
it can change makes no difference.

> 6.7.8 Initialization
>
> [...]
>
> [#4] All the expressions in an initializer for an object
> that has static storage duration shall be constant
> expressions or string literals.
>
> Can someone point me to text that says that 'const' is not 'constant
> expression' and can in fact change?


Nothing in the standard states that a const object may change. But
there is a precise definition of what constitutes a constant
expression, in 6.6 Constant expressions. Nowhere in that section does
it include the value of an object, regardless of const qualification,
as a constant expression.

> He claims that the compiler may choose to substitute the value at
> compile time.
> I tried to explain how the value can change (but I had to use pointers
> to const int) which he shot down saying the comparison of examples is
> not valid (it's not initializer and it involves pointers).


It is no longer a C program if you attempt to change an object defined
with the const qualifier.

> Question2
> Moreover, if we turn on optimization, (and assume that the real code
> does not have any dead code like above), the compiler does not give any
> error. Is the compiler correct after optimisation?


The compiler is neither correct nor incorrect, see below.

> I think it is a bug in compiler but I need text in standard to prove
> that.


No, it's not a bug in the compiler. But it is not portable behavior
either. Paragraph 10 of 6.6 consists of one sentence, which is "An
implementation may accept other forms of constant expressions."

So if your implementation happens to define the value of an object
defined with the const qualifier and an initializer, in scope, as a
constant expression, apparently the standard allows it to.

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://c-faq.com/
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.contrib.andrew.cmu.edu/~a...FAQ-acllc.html
 
Reply With Quote
 
Marc Boyer
Guest
Posts: n/a
 
      04-20-2006
Le 19-04-2006, (E-Mail Removed) <(E-Mail Removed)> a écrit*:
> Marc Boyer wrote:
>> Le 19-04-2006, (E-Mail Removed) <(E-Mail Removed)> a écrit :
>> > Thanks Marc, point noted.
>> >
>> > Now getting back to my example,
>> >
>> > const int a = 10;
>> >
>> > In this case, can value of 'a' change?

>>
>> Not to my knowledge.
>>
>> > If so how?
>> > If not, why can not variable 'a' be treated a compile time constant.

>>
>> It 'can' in this case. But, just try to explain in wich case
>> it can and when it can not....

>
>
> My bad. I did not include complete text.
> Let me include enough context and repost.
>
> ~> cat test.c
> const int a = 10;
> int main () {
> static int b = a;
> return b;
> }
>
> If the compiler can treat this 'a' as a compile time constant then this
> should also compile.


It depend what you mean by 'the compiler can'. I think that, if
someone is able to write a C compiler, he would also be able to
write a augmented C compiler that, *in this special case*,
see that a is constant at compile time.

You should notice also that this is a valid C++ code,
but C++ does not require that static variable are initialized
by constant.

But in C, there is a standard that defines what must be accepted
by a C compiler. In this case, it may be detected because the value
of your const variable can be known at compile time By, in this case,
it should also accept
int main(){
int a=1;
static int b=a;
a--;
return a;
}

In this case, a is not any more a constant, but b is always
initialized with value 1.

And what about
const int a= random()?1:1;
or
const int a= random()?1:10/10;

What I mean is that, in the general case, it is hard (perhaps
undecidable in fact) to know when a const variable is a compile time
constant, and whan is is not. But, what is sure is that a constant
expression is a compile time constant. Then, the people who wrote
the standard have chosen to allow only initialisation of static
variable with constant expression.

This choice has the benefit of simplicity.

Marc Boyer
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
const vector<const MyType> Vs const vector<MyType> magnus.moraberg@gmail.com C++ 2 02-09-2009 10:45 PM
is const necessary in eg int compar(const void *, const void *) lovecreatesbeauty@gmail.c0m C Programming 26 11-10-2008 09:47 PM
const correctness - should C++ prefer const member over non-const? fungus C++ 13 10-31-2008 05:33 AM
const vector<A> vs vector<const A> vs const vector<const A> Javier C++ 2 09-04-2007 08:46 PM
Casting int'** to 'const int * const * const' dosn't work, why? Jonas.Holmsten@gmail.com C Programming 11 07-01-2007 06:16 PM



Advertisments