Does char == char implicitly cast both operands to int?
I am freshening up my C++ skills, using a copy of the german book "C++ - Das Übungsbuch"; 5. Auflage from mitp.
Exercise 8.1 poses the following question (translated and reduced to the relevant content):
8.1 Given the following definition:
char c = 'q';
Determine the type to which the operands will be converted during evaluation of the following statements:
a)
c == 'Q'
My answer would have been char
, as c
is declared as a char
and as far as I understood, 'Q'
is a character literal. The solution however states:
a) The type of both operands will be converted to
int
This confuses me. Is it really the case, that a char == char
comparison is implicitly converted to int == int
and why would this be done? If the question were
a)
c == 82
I could have understood that 82
would be interpreted as an integer constant and therefor c
would be converted to int
as well, but the answer explicitly mentions both operands to be converted.
Can someone explain this to me please?
c++
add a comment |
I am freshening up my C++ skills, using a copy of the german book "C++ - Das Übungsbuch"; 5. Auflage from mitp.
Exercise 8.1 poses the following question (translated and reduced to the relevant content):
8.1 Given the following definition:
char c = 'q';
Determine the type to which the operands will be converted during evaluation of the following statements:
a)
c == 'Q'
My answer would have been char
, as c
is declared as a char
and as far as I understood, 'Q'
is a character literal. The solution however states:
a) The type of both operands will be converted to
int
This confuses me. Is it really the case, that a char == char
comparison is implicitly converted to int == int
and why would this be done? If the question were
a)
c == 82
I could have understood that 82
would be interpreted as an integer constant and therefor c
would be converted to int
as well, but the answer explicitly mentions both operands to be converted.
Can someone explain this to me please?
c++
5
Yes, technically both operands get casted toint
. However, most compilers will not generate the actual code to do that, because a compiler is permitted to perform any optimization that has no observable effect, and it's pretty much impossible to observe the effect of this optimization. But, technically, both are promoted to int.
– Sam Varshavchik
Jan 1 at 16:35
2
Just a bit of terminology: this question is about implicit conversions, not casts. A cast is something you write in your source code to tell the compiler to do a conversion. There is no such thing as an implicit cast.
– Pete Becker
Jan 1 at 16:48
@PeteBecker Thank you, I'll fix that. I already thought that cast wouldn't be the correct term here, but I was lost for the correct word, which you now provided. :)
– T3 H40
Jan 1 at 16:50
add a comment |
I am freshening up my C++ skills, using a copy of the german book "C++ - Das Übungsbuch"; 5. Auflage from mitp.
Exercise 8.1 poses the following question (translated and reduced to the relevant content):
8.1 Given the following definition:
char c = 'q';
Determine the type to which the operands will be converted during evaluation of the following statements:
a)
c == 'Q'
My answer would have been char
, as c
is declared as a char
and as far as I understood, 'Q'
is a character literal. The solution however states:
a) The type of both operands will be converted to
int
This confuses me. Is it really the case, that a char == char
comparison is implicitly converted to int == int
and why would this be done? If the question were
a)
c == 82
I could have understood that 82
would be interpreted as an integer constant and therefor c
would be converted to int
as well, but the answer explicitly mentions both operands to be converted.
Can someone explain this to me please?
c++
I am freshening up my C++ skills, using a copy of the german book "C++ - Das Übungsbuch"; 5. Auflage from mitp.
Exercise 8.1 poses the following question (translated and reduced to the relevant content):
8.1 Given the following definition:
char c = 'q';
Determine the type to which the operands will be converted during evaluation of the following statements:
a)
c == 'Q'
My answer would have been char
, as c
is declared as a char
and as far as I understood, 'Q'
is a character literal. The solution however states:
a) The type of both operands will be converted to
int
This confuses me. Is it really the case, that a char == char
comparison is implicitly converted to int == int
and why would this be done? If the question were
a)
c == 82
I could have understood that 82
would be interpreted as an integer constant and therefor c
would be converted to int
as well, but the answer explicitly mentions both operands to be converted.
Can someone explain this to me please?
c++
c++
edited Jan 1 at 16:51
T3 H40
asked Jan 1 at 16:31
T3 H40T3 H40
1,48072330
1,48072330
5
Yes, technically both operands get casted toint
. However, most compilers will not generate the actual code to do that, because a compiler is permitted to perform any optimization that has no observable effect, and it's pretty much impossible to observe the effect of this optimization. But, technically, both are promoted to int.
– Sam Varshavchik
Jan 1 at 16:35
2
Just a bit of terminology: this question is about implicit conversions, not casts. A cast is something you write in your source code to tell the compiler to do a conversion. There is no such thing as an implicit cast.
– Pete Becker
Jan 1 at 16:48
@PeteBecker Thank you, I'll fix that. I already thought that cast wouldn't be the correct term here, but I was lost for the correct word, which you now provided. :)
– T3 H40
Jan 1 at 16:50
add a comment |
5
Yes, technically both operands get casted toint
. However, most compilers will not generate the actual code to do that, because a compiler is permitted to perform any optimization that has no observable effect, and it's pretty much impossible to observe the effect of this optimization. But, technically, both are promoted to int.
– Sam Varshavchik
Jan 1 at 16:35
2
Just a bit of terminology: this question is about implicit conversions, not casts. A cast is something you write in your source code to tell the compiler to do a conversion. There is no such thing as an implicit cast.
– Pete Becker
Jan 1 at 16:48
@PeteBecker Thank you, I'll fix that. I already thought that cast wouldn't be the correct term here, but I was lost for the correct word, which you now provided. :)
– T3 H40
Jan 1 at 16:50
5
5
Yes, technically both operands get casted to
int
. However, most compilers will not generate the actual code to do that, because a compiler is permitted to perform any optimization that has no observable effect, and it's pretty much impossible to observe the effect of this optimization. But, technically, both are promoted to int.– Sam Varshavchik
Jan 1 at 16:35
Yes, technically both operands get casted to
int
. However, most compilers will not generate the actual code to do that, because a compiler is permitted to perform any optimization that has no observable effect, and it's pretty much impossible to observe the effect of this optimization. But, technically, both are promoted to int.– Sam Varshavchik
Jan 1 at 16:35
2
2
Just a bit of terminology: this question is about implicit conversions, not casts. A cast is something you write in your source code to tell the compiler to do a conversion. There is no such thing as an implicit cast.
– Pete Becker
Jan 1 at 16:48
Just a bit of terminology: this question is about implicit conversions, not casts. A cast is something you write in your source code to tell the compiler to do a conversion. There is no such thing as an implicit cast.
– Pete Becker
Jan 1 at 16:48
@PeteBecker Thank you, I'll fix that. I already thought that cast wouldn't be the correct term here, but I was lost for the correct word, which you now provided. :)
– T3 H40
Jan 1 at 16:50
@PeteBecker Thank you, I'll fix that. I already thought that cast wouldn't be the correct term here, but I was lost for the correct word, which you now provided. :)
– T3 H40
Jan 1 at 16:50
add a comment |
2 Answers
2
active
oldest
votes
The book is talking about usual arithmetic conversion which happens if both operands have arithmetic types (which is true for all integer types, including char
). That leads to integral promotion.
add a comment |
I think, that it uses for the comparison the ascii number corresponding to your character.
For example it converts q to 113 and Q to 81.
So it should compare:
'Q'=='q' //81==113
They are casted into integer because C interprets character as number of the ascii table.
See https://www.rapidtables.com/code/text/ascii-table.html
1
The question is about C++, and C and C++ behaves differently
– Basile Starynkevitch
Jan 1 at 16:43
Haven't read C++ tag sorry, my bad
– Massimo Simone
Jan 1 at 16:44
1
I don't think this question is as much about internalchar
representation as it is about how integral comparisons work according to the standard.
– Moira
Jan 1 at 16:46
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%2f53997093%2fdoes-char-char-implicitly-cast-both-operands-to-int%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
The book is talking about usual arithmetic conversion which happens if both operands have arithmetic types (which is true for all integer types, including char
). That leads to integral promotion.
add a comment |
The book is talking about usual arithmetic conversion which happens if both operands have arithmetic types (which is true for all integer types, including char
). That leads to integral promotion.
add a comment |
The book is talking about usual arithmetic conversion which happens if both operands have arithmetic types (which is true for all integer types, including char
). That leads to integral promotion.
The book is talking about usual arithmetic conversion which happens if both operands have arithmetic types (which is true for all integer types, including char
). That leads to integral promotion.
answered Jan 1 at 16:40
Some programmer dudeSome programmer dude
302k25264424
302k25264424
add a comment |
add a comment |
I think, that it uses for the comparison the ascii number corresponding to your character.
For example it converts q to 113 and Q to 81.
So it should compare:
'Q'=='q' //81==113
They are casted into integer because C interprets character as number of the ascii table.
See https://www.rapidtables.com/code/text/ascii-table.html
1
The question is about C++, and C and C++ behaves differently
– Basile Starynkevitch
Jan 1 at 16:43
Haven't read C++ tag sorry, my bad
– Massimo Simone
Jan 1 at 16:44
1
I don't think this question is as much about internalchar
representation as it is about how integral comparisons work according to the standard.
– Moira
Jan 1 at 16:46
add a comment |
I think, that it uses for the comparison the ascii number corresponding to your character.
For example it converts q to 113 and Q to 81.
So it should compare:
'Q'=='q' //81==113
They are casted into integer because C interprets character as number of the ascii table.
See https://www.rapidtables.com/code/text/ascii-table.html
1
The question is about C++, and C and C++ behaves differently
– Basile Starynkevitch
Jan 1 at 16:43
Haven't read C++ tag sorry, my bad
– Massimo Simone
Jan 1 at 16:44
1
I don't think this question is as much about internalchar
representation as it is about how integral comparisons work according to the standard.
– Moira
Jan 1 at 16:46
add a comment |
I think, that it uses for the comparison the ascii number corresponding to your character.
For example it converts q to 113 and Q to 81.
So it should compare:
'Q'=='q' //81==113
They are casted into integer because C interprets character as number of the ascii table.
See https://www.rapidtables.com/code/text/ascii-table.html
I think, that it uses for the comparison the ascii number corresponding to your character.
For example it converts q to 113 and Q to 81.
So it should compare:
'Q'=='q' //81==113
They are casted into integer because C interprets character as number of the ascii table.
See https://www.rapidtables.com/code/text/ascii-table.html
answered Jan 1 at 16:39
Massimo SimoneMassimo Simone
36
36
1
The question is about C++, and C and C++ behaves differently
– Basile Starynkevitch
Jan 1 at 16:43
Haven't read C++ tag sorry, my bad
– Massimo Simone
Jan 1 at 16:44
1
I don't think this question is as much about internalchar
representation as it is about how integral comparisons work according to the standard.
– Moira
Jan 1 at 16:46
add a comment |
1
The question is about C++, and C and C++ behaves differently
– Basile Starynkevitch
Jan 1 at 16:43
Haven't read C++ tag sorry, my bad
– Massimo Simone
Jan 1 at 16:44
1
I don't think this question is as much about internalchar
representation as it is about how integral comparisons work according to the standard.
– Moira
Jan 1 at 16:46
1
1
The question is about C++, and C and C++ behaves differently
– Basile Starynkevitch
Jan 1 at 16:43
The question is about C++, and C and C++ behaves differently
– Basile Starynkevitch
Jan 1 at 16:43
Haven't read C++ tag sorry, my bad
– Massimo Simone
Jan 1 at 16:44
Haven't read C++ tag sorry, my bad
– Massimo Simone
Jan 1 at 16:44
1
1
I don't think this question is as much about internal
char
representation as it is about how integral comparisons work according to the standard.– Moira
Jan 1 at 16:46
I don't think this question is as much about internal
char
representation as it is about how integral comparisons work according to the standard.– Moira
Jan 1 at 16:46
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.
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%2f53997093%2fdoes-char-char-implicitly-cast-both-operands-to-int%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
5
Yes, technically both operands get casted to
int
. However, most compilers will not generate the actual code to do that, because a compiler is permitted to perform any optimization that has no observable effect, and it's pretty much impossible to observe the effect of this optimization. But, technically, both are promoted to int.– Sam Varshavchik
Jan 1 at 16:35
2
Just a bit of terminology: this question is about implicit conversions, not casts. A cast is something you write in your source code to tell the compiler to do a conversion. There is no such thing as an implicit cast.
– Pete Becker
Jan 1 at 16:48
@PeteBecker Thank you, I'll fix that. I already thought that cast wouldn't be the correct term here, but I was lost for the correct word, which you now provided. :)
– T3 H40
Jan 1 at 16:50