How exactly is this function an example of a char to int conversion?
The book The C Programming Language by Kernighan and Ritchie, second edition states on page 43 in the chapter about Type Conversions:
Another example of
chartointconversion is the functionlower, which maps a single character to lower case for the ASCII character set. If the character is not an upper case letter,lowerreturns returns it unchanged.
/* lower: convert c to lower case; ASCII only */
int lower(int c)
{
if (c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
}
It isn't mentioned explicitly in the text so I'd like to make sure I understand it correctly: The conversion happens when you call the lower function with a variable of type char, doesn't it? Especially, the expression
c >= 'A'
has nothing to do with a conversion from int to char since a character constant like 'A'
is handled as an int internally from the start, isn't it? Edit: Or is this different (e.g. a character constant being treated as a char) for ANSI C, which the book covers?
c type-conversion kernighan-and-ritchie
add a comment |
The book The C Programming Language by Kernighan and Ritchie, second edition states on page 43 in the chapter about Type Conversions:
Another example of
chartointconversion is the functionlower, which maps a single character to lower case for the ASCII character set. If the character is not an upper case letter,lowerreturns returns it unchanged.
/* lower: convert c to lower case; ASCII only */
int lower(int c)
{
if (c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
}
It isn't mentioned explicitly in the text so I'd like to make sure I understand it correctly: The conversion happens when you call the lower function with a variable of type char, doesn't it? Especially, the expression
c >= 'A'
has nothing to do with a conversion from int to char since a character constant like 'A'
is handled as an int internally from the start, isn't it? Edit: Or is this different (e.g. a character constant being treated as a char) for ANSI C, which the book covers?
c type-conversion kernighan-and-ritchie
add a comment |
The book The C Programming Language by Kernighan and Ritchie, second edition states on page 43 in the chapter about Type Conversions:
Another example of
chartointconversion is the functionlower, which maps a single character to lower case for the ASCII character set. If the character is not an upper case letter,lowerreturns returns it unchanged.
/* lower: convert c to lower case; ASCII only */
int lower(int c)
{
if (c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
}
It isn't mentioned explicitly in the text so I'd like to make sure I understand it correctly: The conversion happens when you call the lower function with a variable of type char, doesn't it? Especially, the expression
c >= 'A'
has nothing to do with a conversion from int to char since a character constant like 'A'
is handled as an int internally from the start, isn't it? Edit: Or is this different (e.g. a character constant being treated as a char) for ANSI C, which the book covers?
c type-conversion kernighan-and-ritchie
The book The C Programming Language by Kernighan and Ritchie, second edition states on page 43 in the chapter about Type Conversions:
Another example of
chartointconversion is the functionlower, which maps a single character to lower case for the ASCII character set. If the character is not an upper case letter,lowerreturns returns it unchanged.
/* lower: convert c to lower case; ASCII only */
int lower(int c)
{
if (c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
}
It isn't mentioned explicitly in the text so I'd like to make sure I understand it correctly: The conversion happens when you call the lower function with a variable of type char, doesn't it? Especially, the expression
c >= 'A'
has nothing to do with a conversion from int to char since a character constant like 'A'
is handled as an int internally from the start, isn't it? Edit: Or is this different (e.g. a character constant being treated as a char) for ANSI C, which the book covers?
c type-conversion kernighan-and-ritchie
c type-conversion kernighan-and-ritchie
edited 5 hours ago
asked 6 hours ago
efie
367216
367216
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
K&R C is old. Really old. Many particulars of K&R C are no longer true in up-to-date standard C.
In stadard, up-to-date C11, there is no conversion to/from char in the function you posted:
/* lower: convert c to lower case; ASCII only */
int lower(int c)
{
if (c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
}
The function accepts int arguments as int c, and per 6.4.4.4 Character constants of the C standard, character literals are of type int.
Thus the entire lower function, as posted, under C11 deals entirely with int values.
The conversion, if any, is may be done when the function is called:
char upperA = 'A`;
// this will implicitly promote the upperA char
// value to an int value
char lowerA = lower( upperA );
Note that this is one of the differences between C and C++. In C++, character literals are of type char, not int.
Thanks! Do you know if a character constant was of typeintin ANSI C as well? Or was it of typecharwhich would add another explanation?
– efie
5 hours ago
add a comment |
Character constants have type int, as you expected, so you are correct that there are no promotions to int in this function.
Any promotion that may occur would happen if a variable of type char is passed to this function, and this is most likely what the text is referring to.
The type of character constants is int in both the current C17 standard (section 6.4.4.4p10):
An integer character constant has type
int
And in the C89 / ANSI C standard (section 3.1.3.4 under Semantics):
An integer character constant has type
int
The latter of which is what K&R Second Edition refers to.
1
K&R precedes the C standard. Is there reason to believe that, in their text, the type of'a'wasintand notchar?
– Eric Postpischil
6 hours ago
@EricPostpischil On page 37 the book says: "A character constant is an integer, written as one character within single quotes, such as'x'". I'm not sure if "is an integer" means "is of typeint"?
– efie
6 hours ago
2
@efie:char,short,int, andlongare all integer types, and an integer is just a value, so I do not think their reference to a character as an integer is informative.
– Eric Postpischil
6 hours ago
That makes sense, thanks. Regarding your first comment: On page two the book says: "The second edition of The C Programming Language describes C as defined by the ANSI standard."
– efie
6 hours ago
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53926270%2fhow-exactly-is-this-function-an-example-of-a-char-to-int-conversion%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
K&R C is old. Really old. Many particulars of K&R C are no longer true in up-to-date standard C.
In stadard, up-to-date C11, there is no conversion to/from char in the function you posted:
/* lower: convert c to lower case; ASCII only */
int lower(int c)
{
if (c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
}
The function accepts int arguments as int c, and per 6.4.4.4 Character constants of the C standard, character literals are of type int.
Thus the entire lower function, as posted, under C11 deals entirely with int values.
The conversion, if any, is may be done when the function is called:
char upperA = 'A`;
// this will implicitly promote the upperA char
// value to an int value
char lowerA = lower( upperA );
Note that this is one of the differences between C and C++. In C++, character literals are of type char, not int.
Thanks! Do you know if a character constant was of typeintin ANSI C as well? Or was it of typecharwhich would add another explanation?
– efie
5 hours ago
add a comment |
K&R C is old. Really old. Many particulars of K&R C are no longer true in up-to-date standard C.
In stadard, up-to-date C11, there is no conversion to/from char in the function you posted:
/* lower: convert c to lower case; ASCII only */
int lower(int c)
{
if (c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
}
The function accepts int arguments as int c, and per 6.4.4.4 Character constants of the C standard, character literals are of type int.
Thus the entire lower function, as posted, under C11 deals entirely with int values.
The conversion, if any, is may be done when the function is called:
char upperA = 'A`;
// this will implicitly promote the upperA char
// value to an int value
char lowerA = lower( upperA );
Note that this is one of the differences between C and C++. In C++, character literals are of type char, not int.
Thanks! Do you know if a character constant was of typeintin ANSI C as well? Or was it of typecharwhich would add another explanation?
– efie
5 hours ago
add a comment |
K&R C is old. Really old. Many particulars of K&R C are no longer true in up-to-date standard C.
In stadard, up-to-date C11, there is no conversion to/from char in the function you posted:
/* lower: convert c to lower case; ASCII only */
int lower(int c)
{
if (c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
}
The function accepts int arguments as int c, and per 6.4.4.4 Character constants of the C standard, character literals are of type int.
Thus the entire lower function, as posted, under C11 deals entirely with int values.
The conversion, if any, is may be done when the function is called:
char upperA = 'A`;
// this will implicitly promote the upperA char
// value to an int value
char lowerA = lower( upperA );
Note that this is one of the differences between C and C++. In C++, character literals are of type char, not int.
K&R C is old. Really old. Many particulars of K&R C are no longer true in up-to-date standard C.
In stadard, up-to-date C11, there is no conversion to/from char in the function you posted:
/* lower: convert c to lower case; ASCII only */
int lower(int c)
{
if (c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
}
The function accepts int arguments as int c, and per 6.4.4.4 Character constants of the C standard, character literals are of type int.
Thus the entire lower function, as posted, under C11 deals entirely with int values.
The conversion, if any, is may be done when the function is called:
char upperA = 'A`;
// this will implicitly promote the upperA char
// value to an int value
char lowerA = lower( upperA );
Note that this is one of the differences between C and C++. In C++, character literals are of type char, not int.
answered 6 hours ago
Andrew Henle
19.4k21333
19.4k21333
Thanks! Do you know if a character constant was of typeintin ANSI C as well? Or was it of typecharwhich would add another explanation?
– efie
5 hours ago
add a comment |
Thanks! Do you know if a character constant was of typeintin ANSI C as well? Or was it of typecharwhich would add another explanation?
– efie
5 hours ago
Thanks! Do you know if a character constant was of type
int in ANSI C as well? Or was it of type char which would add another explanation?– efie
5 hours ago
Thanks! Do you know if a character constant was of type
int in ANSI C as well? Or was it of type char which would add another explanation?– efie
5 hours ago
add a comment |
Character constants have type int, as you expected, so you are correct that there are no promotions to int in this function.
Any promotion that may occur would happen if a variable of type char is passed to this function, and this is most likely what the text is referring to.
The type of character constants is int in both the current C17 standard (section 6.4.4.4p10):
An integer character constant has type
int
And in the C89 / ANSI C standard (section 3.1.3.4 under Semantics):
An integer character constant has type
int
The latter of which is what K&R Second Edition refers to.
1
K&R precedes the C standard. Is there reason to believe that, in their text, the type of'a'wasintand notchar?
– Eric Postpischil
6 hours ago
@EricPostpischil On page 37 the book says: "A character constant is an integer, written as one character within single quotes, such as'x'". I'm not sure if "is an integer" means "is of typeint"?
– efie
6 hours ago
2
@efie:char,short,int, andlongare all integer types, and an integer is just a value, so I do not think their reference to a character as an integer is informative.
– Eric Postpischil
6 hours ago
That makes sense, thanks. Regarding your first comment: On page two the book says: "The second edition of The C Programming Language describes C as defined by the ANSI standard."
– efie
6 hours ago
add a comment |
Character constants have type int, as you expected, so you are correct that there are no promotions to int in this function.
Any promotion that may occur would happen if a variable of type char is passed to this function, and this is most likely what the text is referring to.
The type of character constants is int in both the current C17 standard (section 6.4.4.4p10):
An integer character constant has type
int
And in the C89 / ANSI C standard (section 3.1.3.4 under Semantics):
An integer character constant has type
int
The latter of which is what K&R Second Edition refers to.
1
K&R precedes the C standard. Is there reason to believe that, in their text, the type of'a'wasintand notchar?
– Eric Postpischil
6 hours ago
@EricPostpischil On page 37 the book says: "A character constant is an integer, written as one character within single quotes, such as'x'". I'm not sure if "is an integer" means "is of typeint"?
– efie
6 hours ago
2
@efie:char,short,int, andlongare all integer types, and an integer is just a value, so I do not think their reference to a character as an integer is informative.
– Eric Postpischil
6 hours ago
That makes sense, thanks. Regarding your first comment: On page two the book says: "The second edition of The C Programming Language describes C as defined by the ANSI standard."
– efie
6 hours ago
add a comment |
Character constants have type int, as you expected, so you are correct that there are no promotions to int in this function.
Any promotion that may occur would happen if a variable of type char is passed to this function, and this is most likely what the text is referring to.
The type of character constants is int in both the current C17 standard (section 6.4.4.4p10):
An integer character constant has type
int
And in the C89 / ANSI C standard (section 3.1.3.4 under Semantics):
An integer character constant has type
int
The latter of which is what K&R Second Edition refers to.
Character constants have type int, as you expected, so you are correct that there are no promotions to int in this function.
Any promotion that may occur would happen if a variable of type char is passed to this function, and this is most likely what the text is referring to.
The type of character constants is int in both the current C17 standard (section 6.4.4.4p10):
An integer character constant has type
int
And in the C89 / ANSI C standard (section 3.1.3.4 under Semantics):
An integer character constant has type
int
The latter of which is what K&R Second Edition refers to.
edited 4 hours ago
answered 6 hours ago
dbush
91.9k12100131
91.9k12100131
1
K&R precedes the C standard. Is there reason to believe that, in their text, the type of'a'wasintand notchar?
– Eric Postpischil
6 hours ago
@EricPostpischil On page 37 the book says: "A character constant is an integer, written as one character within single quotes, such as'x'". I'm not sure if "is an integer" means "is of typeint"?
– efie
6 hours ago
2
@efie:char,short,int, andlongare all integer types, and an integer is just a value, so I do not think their reference to a character as an integer is informative.
– Eric Postpischil
6 hours ago
That makes sense, thanks. Regarding your first comment: On page two the book says: "The second edition of The C Programming Language describes C as defined by the ANSI standard."
– efie
6 hours ago
add a comment |
1
K&R precedes the C standard. Is there reason to believe that, in their text, the type of'a'wasintand notchar?
– Eric Postpischil
6 hours ago
@EricPostpischil On page 37 the book says: "A character constant is an integer, written as one character within single quotes, such as'x'". I'm not sure if "is an integer" means "is of typeint"?
– efie
6 hours ago
2
@efie:char,short,int, andlongare all integer types, and an integer is just a value, so I do not think their reference to a character as an integer is informative.
– Eric Postpischil
6 hours ago
That makes sense, thanks. Regarding your first comment: On page two the book says: "The second edition of The C Programming Language describes C as defined by the ANSI standard."
– efie
6 hours ago
1
1
K&R precedes the C standard. Is there reason to believe that, in their text, the type of
'a' was int and not char?– Eric Postpischil
6 hours ago
K&R precedes the C standard. Is there reason to believe that, in their text, the type of
'a' was int and not char?– Eric Postpischil
6 hours ago
@EricPostpischil On page 37 the book says: "A character constant is an integer, written as one character within single quotes, such as
'x'". I'm not sure if "is an integer" means "is of type int"?– efie
6 hours ago
@EricPostpischil On page 37 the book says: "A character constant is an integer, written as one character within single quotes, such as
'x'". I'm not sure if "is an integer" means "is of type int"?– efie
6 hours ago
2
2
@efie:
char, short, int, and long are all integer types, and an integer is just a value, so I do not think their reference to a character as an integer is informative.– Eric Postpischil
6 hours ago
@efie:
char, short, int, and long are all integer types, and an integer is just a value, so I do not think their reference to a character as an integer is informative.– Eric Postpischil
6 hours ago
That makes sense, thanks. Regarding your first comment: On page two the book says: "The second edition of The C Programming Language describes C as defined by the ANSI standard."
– efie
6 hours ago
That makes sense, thanks. Regarding your first comment: On page two the book says: "The second edition of The C Programming Language describes C as defined by the ANSI standard."
– efie
6 hours ago
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53926270%2fhow-exactly-is-this-function-an-example-of-a-char-to-int-conversion%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown