aug*_*tin 0 c++ linux casting char
我读高级Linux编程第2章:
http://www.advancedlinuxprogramming.com/alp-folder/alp-ch02-writing-good-gnu-linux-software.pdf
在本节中2.1.3 Using getopt_long,有一个示例程序有点像这样:
int main (int argc, char* argv[]) {
int next_option;
// ...
do {
next_option = getopt_long (argc, argv, short_options, long_options, NULL);
switch (next_option) {
case ‘h’: /* -h or --help */
// ...
}
// ...
Run Code Online (Sandbox Code Playgroud)
引起我注意的是next_option被声明为int.函数getopt_long()显然返回表示其在下面的switch语句中使用的短命令行参数的int.为什么可以将该整数与switch语句中的字符进行比较?
是否有从char(单个字符?)到int的隐式转换?上面的代码如何有效?(参见链接pdf中的完整代码)
C和C++都没有一种类型可以将"字符"存储为具有一些专用字符特定属性的值.从这个意义上说,C和C++都没有"字符"类型.
在C++和C语言中char都是一个完整的类型.它包含数字.它只是一个最小的(在范围方面)整数类型.之间的转换char和int存在,就像它之间存在int和long或int和short.char在其他整数类型中没有特殊的状态(除了char类型与signed char类型不同的事实).
'h'C++中的文字的字面值具有类型char,但与其他任何整数类型相似int.这就是为什么你可以在case标签中使用它在原始示例中使用的方式.
换句话说,你的原始代码就像"奇怪"一样
switch (next_option) {
case 1L: ...
// ...
}
Run Code Online (Sandbox Code Playgroud)
将会.在这种情况下,switch参数是a int,但case标签是a long.代码有效.你觉得它令人惊讶吗?可能不是.你的例子并'h'没有太大的不同.