C++基础题1--C++三元运算符的一个有意思的地方
2013-05-28 03:33
309 查看
问题如下:
代码一
[cpp] view
plaincopy
cout << (1 > 2 ? 1 : "1") << endl;
代码二
[cpp] view
plaincopy
cout << (1 > 2 ? 0 : "1") << endl;
代码三
[cpp] view
plaincopy
cout << (1 > 2 ? "hello" : "hi") << endl;
运行结果是代码一出错 error C2446: “:”: 没有从“const char *”到“int”的转换,代码二和三没有任何问题。
这里再回顾下三元运算符的用法。
val = exp1 ? exp2 : exp3
exp1为真则val = exp2否则val = exp3。
因此不论什么时候都会涉及到一个val后等号的类型转换。
答案其实很简单,0可以视作null,因此默认代码二中cout输出类型是char *,代码三中亦是如此,而代码一中则会出现两种不同的类型,无法顺利进行类型转换。
此外如果是代码二的条件为假的情况,则连endl也不会输出,这个就不知道怎么回事了。
代码四:
[cpp] view
plaincopy
cout << (1 > 2 ? 0 : '1') << endl;
会正确的转换成int类型。
结论:
编译器在编译的时候就根据exp2和exp3确定了val的接收类型,再传给cout。
这里一个不规范的0的写法导致了代码二的正常执行。
代码一
[cpp] view
plaincopy
cout << (1 > 2 ? 1 : "1") << endl;
代码二
[cpp] view
plaincopy
cout << (1 > 2 ? 0 : "1") << endl;
代码三
[cpp] view
plaincopy
cout << (1 > 2 ? "hello" : "hi") << endl;
运行结果是代码一出错 error C2446: “:”: 没有从“const char *”到“int”的转换,代码二和三没有任何问题。
这里再回顾下三元运算符的用法。
val = exp1 ? exp2 : exp3
exp1为真则val = exp2否则val = exp3。
因此不论什么时候都会涉及到一个val后等号的类型转换。
答案其实很简单,0可以视作null,因此默认代码二中cout输出类型是char *,代码三中亦是如此,而代码一中则会出现两种不同的类型,无法顺利进行类型转换。
此外如果是代码二的条件为假的情况,则连endl也不会输出,这个就不知道怎么回事了。
代码四:
[cpp] view
plaincopy
cout << (1 > 2 ? 0 : '1') << endl;
会正确的转换成int类型。
结论:
编译器在编译的时候就根据exp2和exp3确定了val的接收类型,再传给cout。
这里一个不规范的0的写法导致了代码二的正常执行。
相关文章推荐
- C++三元运算符的一个有意思的地方
- 一个easyui treegrid有意思的地方
- c++ 模板的一个例子,实参演绎的时候,有个地方没看明白
- !!!有奖竞猜!!!运行以下程序,会出现什么问题?为什么?(一个C++的基础题)
- 关于C++语法的一个容易出错的地方。
- [C++基础]一个比较常用的配置文件/初始化文件读取程序
- C++基础知识(2)--构造一个类的一般顺序
- C++基础之两个头文件使用同一个变量会重复定义怎么办
- 关于C++中数据基础数据类型的一个杂记
- [C++基础]027_数组和指针是不等价的一个实例
- <C/C++基础>设计一个String类(重载运算符等)
- c++一些入门基础,也是初学者容易卡住的地方
- 一个基础但是隐晦的c++语法问题
- Java基础:从C++转到Java需注意的地方
- 一个有意思的C++泛型比较技巧文章
- 【Java基础】一个有意思的泛型方法Arrays.asList(T... a)
- CPP-基础:C++中为什么需要一个头文件,一个cpp文件
- [基础]Java编程中自加,自减易被忽视的一个地方,打印命令的输出
- C++转向Objective-C需要注意的地方(基础)。
- Python一个有意思的地方:reduce、map、filter