三目运算中的类型转换

 

1、双目数值提升时进行拆箱转换和值集转换(value set conversion)

2、如果出现 long、double 等大类型,一律向大类型转。

一、表达式二与表达式三都为变量

    1、两个变量为 char, byte,short  的小类型中的两种,其类型不同, 结果会转化为 int 类型

    2、两个变量类型大小不同,结果转化为大类型。

二、表达式二与表达式三为常量与 变量T类型

    当常量可以表示成T类型时,就转为T类型。

三、表达式二与表达式三都为常量 

    1、操作数其中一个是 byte 或 Byte 类型,而另一个是 short 或 Short 类型,那么这个表达式就是 short 类型

    2、两个变量为 char、 byte 或 char 、short ,其类型不同, 结果会转化为 int 类型。   

    3、操作数中的一个是类型 T (T 可以是 byte、short 或者是 char 类型),而另一个是 int 类型的常数,其可以用 T 类型来表示时,那么这个表达式就是 T 类型

   

什么叫可以用T类型表示: 

  这涉及到类型的表示范围,如果在类型范围内,就是可以表示。

1、byte  short  int  都是表示整数的,只是范围不同。

  byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1) 
  short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1)
  int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1) 

  long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)

  如果JAVA中出现了一个整数数字比如35,那么这个数字就是int型的,如果我们希望它是byte型的,可以在数据后加上大写的 B:35B,表示它是byte型的,同样的35S表示short型,35L表示long型的,表示int我们可以什么都不用加,但是如果要表示long型的,就一定要在数据后面加“L”。

2、float和double是表示浮点型的数据类型,他们之间的区别在于他们的精确度不同 
  float 3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方)占用4个字节 
  double 1.797693e+308~ 4.9000000e-324 占用8个字节
  double型比float型存储范围更大,精度更高,所以通常的浮点型的数据在不声明的情况下都是double型的,如果要表示一个数据是float型的,可以在数据后面加上“F”。

3、char类型表示字符型

  char 取值范围为 0-65535(\u0000~\uFFFF). 无符号占用2个字节,采用unicode编码,它的前128字节编码与ASCII兼容 。

 

转载于:https://www.cnblogs.com/the-wang/p/8119425.html

<think>我们正在讨论三目运算符(也称为条件运算符),其形式为:条件 ? 表达式1 : 表达式2 根据用户提供的引用,我们可以总结以下几点: 1. 基本用法:根据条件选择两个表达式中的一个进行求值。 2. C和C++中的区别:在C语言中,三目运算符不能作为左值,而在C++中可以(通过返回变量的引用)。 3. 类型要求:两个表达式应该具有兼容的类型,否则可能导致未定义行为或编译错误。 我们将按照以下结构组织回答: 一、三目运算符的基本语法 二、C与C++中三目运算符的区别(重点在于左值问题) 三、类型安全与常见陷阱 四、使用示例 五、注意事项 同时,我们将生相关问题。</think>### C/C++ 三目运算符(条件运算符)详解 三目运算符 `? :` 是 C/C++ 中唯一的三元运算符,用于简化条件判断逻辑,基本形式: **`条件 ? 表达式1 : 表达式2`** - **条件为真** → 执行 `表达式1` - **条件为假** → 执行 `表达式2` --- ### 一、基础用法与示例 #### 1. 基本条件判断 ```cpp #include <iostream> int main() { int a = 10, b = 20; // 输出较大值 std::cout << "Max: " << (a > b ? a : b); // 输出: Max: 20 [^1] return 0; } ``` #### 2. 赋值操作 ```cpp int x = 5, y = 3; int max_val = (x > y) ? x : y; // max_val = 5 ``` #### 3. 返回值类型兼容性 **类型必须兼容**,否则引发未定义行为: ```cpp #include <iostream> int main() { int test = 0; // 错误:0 与 "A String" 类型不兼容(int vs const char*) std::cout << (test ? "A String" : 0); // 运行时崩溃 [^3] return 0; } ``` --- ### 二、C 与 C++ 的关键区别:左值支持 | 特性 | C 语言 | C++ 语言 | |------------|-----------------|------------------| | **作为左值** | ❌ 不支持 | ✅ 支持 | | **返回值类型**| 右值(不可修改)| 可返回引用(可修改)| #### 示例对比: ```c // C 语言:编译错误(三目结果不可修改) #include <stdio.h> int main() { int a = 10, b = 20; (a > b ? a : b) = 30; // 错误:表达式不可为左值 [^2] return 0; } ``` ```cpp // C++:支持修改返回值 #include <iostream> int main() { int a = 10, b = 20; (a < b ? a : b) = 100; // 修改较小值为 100 std::cout << "a=" << a << ", b=" << b; // 输出: a=100, b=20 return 0; } ``` --- ### 三、进阶用法 #### 1. 嵌套三目运算 ```cpp int score = 85; char grade = (score >= 90) ? 'A' : (score >= 80) ? 'B' : (score >= 60) ? 'C' : 'D'; // grade = 'B' ``` #### 2. 函数调用选择 ```cpp #include <iostream> void printA() { std::cout << "A"; } void printB() { std::cout << "B"; } int main() { bool flag = true; (flag ? printA : printB)(); // 输出: A return 0; } ``` #### 3. 结合宏定义 ```cpp #define MAX(a, b) ((a) > (b) ? (a) : (b)) int x = 5, y = 8; int max = MAX(x, y); // max = 8 ``` --- ### 四、注意事项 1. **类型一致性** 两个分支表达式类型必须兼容(或可隐式转换): ```cpp auto result = condition ? 10 : 3.14; // result 为 double 类型 ``` 2. **避免副作用** 条件表达式中的函数调用可能多次执行: ```cpp int i = 0; (i++ > 0) ? i++ : i--; // i 最终值不确定(未定义行为) ``` 3. **优先级问题** 三目运算符优先级较低,需用括号明确逻辑: ```cpp int a = 10, b = 20; int c = a > b ? a : b + 5; // 等效于 a > b ? a : (b+5) int d = (a > b) ? a : (b+5); // 显式括号更安全 ``` 4. **可读性** 复杂逻辑避免嵌套三目运算符,改用 `if-else`。 --- ### 五、典型应用场景 1. **初始化常量** ```cpp const int max_size = (system_memory > 16) ? 1024 : 512; ``` 2. **模板元编程** ```cpp template<bool flag> struct Select { using Type = typename std::conditional<flag, int, float>::type; }; ``` 3. **嵌入式资源分配** ```cpp int buffer_size = (is_high_perf) ? 4096 : 1024; ``` > ⚠️ **最佳实践** > - 简单条件判断优先使用三目运算符 > - 复杂逻辑使用 `if-else` 保证可读性 > - 始终检查分支类型兼容性 > - C++ 中利用左值特性简化代码 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值