【C++】C++ 语言对 C 语言的加强 ④ ( C 语言中的三目运算符 - 不能作为左值 | C++ 语言中的三目运算符增强 | C 语言中三目运算符作为左值使用 )

文章目录

  • 一、C 语言中的三目运算符
  • 二、C 语言中 三目运算符 不能作为左值
  • 三、C++ 语言中的三目运算符增强
  • 四、C 语言中 三目运算符 作为左值使用





一、C 语言中的三目运算符



C 语言 中的 " 三目运算符 " , 又称为 " 条件运算符 " , 相当于一个简化版本的 if else 语句 ;


三目运算符语法 :

condition ? expression1 : expression2

上面的 condition 必须是一个 返回布尔值 的表达式 , C 语言中一般是 int ;

  • 如果 condition 的值为 非零值 , 也就是 true , 则整个 三目运算符 表达式 返回 expression1 的值 ;
  • 如果 condition 的值为 零值 , 也就是 false, 则整个 三目运算符 表达式 返回 expression2 的值 ;

代码示例 :

#include 

int main() {  
    int a = 10;  
    int b = 20;  
	
	// 使用三目运算符获取 a 和 b 中的最大值 
    int max = (a > b) ? a : b;  
  
    printf("Maximum value : %d\n", max);  
  
    return 0;  
}

执行结果 :
【C++】C++ 语言对 C 语言的加强 ④ ( C 语言中的三目运算符 - 不能作为左值 | C++ 语言中的三目运算符增强 | C 语言中三目运算符作为左值使用 )_第1张图片


上面是正常使用 三目运算符 进行计算 ;





二、C 语言中 三目运算符 不能作为左值



C 语言中 , 表达式的结果 是 放在 寄存器 中的 , 因此 表达式 的结果 是一个具体的值 , 值 只能读取 , 不能写入 ;

上述代码中 , 三目运算符 表达式 (a > b) ? a : b 的结果是一个数字 , 不是变量 ,

因此 , C 语言 中的 三目运算符 表达式 不能作为左值使用 ;


下面的代码中 , 尝试为 三目运算符表达式 赋值 , 结果报错 ;

代码示例 :

#include 

int main() {  
    int a = 10;  
    int b = 20;  
	
	// 尝试 为 三目运算符 表达式赋值
    (a > b) ? a : b = 30;   
  
    return 0;  
}

执行结果 :

C:\Users\octop\Desktop>gcc hello.c
hello.c: In function 'main':
hello.c:8:21: error: lvalue required as left operand of assignment
     (a > b) ? a : b = 30;
                     ^

C:\Users\octop\Desktop>

【C++】C++ 语言对 C 语言的加强 ④ ( C 语言中的三目运算符 - 不能作为左值 | C++ 语言中的三目运算符增强 | C 语言中三目运算符作为左值使用 )_第2张图片





三、C++ 语言中的三目运算符增强



在 C++ 语言中 , 对 三目运算符表达式 进行了增强 ,

C++ 中 , 三目运算符表达式 返回的是一个 表达式 , 不是实际的值 , 而是表达式本身 ;

在 C++ 中 , 三目运算符 可以作为左值使用 , 就是为 返回的 表达式 赋值 ;


三目运算符语法 :

condition ? expression1 : expression2

上面的 condition 必须是一个 返回布尔值 的表达式 ;

  • 如果 condition 的值为 true , 则整个 三目运算符 表达式 返回 expression1 ;
  • 如果 condition 的值为 false, 则整个 三目运算符 表达式 返回 expression2 ;

注意 C 语言直接返回表达式的值 , C++ 语言返回的是表达式 , 不会求值 ;


C++ 中的 三目运算符 返回的事一个 内存空间地址 , 也就是 表达式变量 的 内存首地址指针 ;

C++ 中的 三目运算符 返回值 , 既可以作为左值 , 又可以作为右值 ;


代码示例 :

// 导入标准 io 流头文件
// 其中定义了 std 命名空间
//#include 
// 导入 std 命名空间
//using namespace std;

#include 

int main() {
    int a = 10;
    int b = 20;

    // 使用三目运算符获取 a 和 b 中的最大值 
    // 并且为 最大值变量 再次赋值 为 30
    int max = (a > b) ? a : b = 30;

    printf("Maximum value : %d\n", max);
    printf("a = %d , b = %d\n", a, b);


    return 0;
}

执行结果 :

Maximum value : 30
a = 10 , b = 30

【C++】C++ 语言对 C 语言的加强 ④ ( C 语言中的三目运算符 - 不能作为左值 | C++ 语言中的三目运算符增强 | C 语言中三目运算符作为左值使用 )_第3张图片





四、C 语言中 三目运算符 作为左值使用



C 语言的 三目运算符 返回的是计算完成之后的值 , 因此 该返回值 不能作为 左值使用 , 不能被赋值 ;

C++ 语言中的 三目运算符 返回的事 变量本身 , 本质是第一个地址 , 可以被赋值 , 既可以作为左值 , 又可以作为右值使用 ;

有个特殊情况 : 如果 三目运算符 返回的是一个常量值 , 那么 C++ 中该返回值不能作为左值 , 也是会报错的 ;


一个表达式可以作为左值 , 那么该表达式必须有内存空间 , 如果让 三目运算符 返回的是 地址 , 那么在 C 语言中 , 可以使用指针为该地址赋值 , 就可以作为左值使用 ;

下面的代码中 , 令 三目运算符 返回 变量的地址 , 然后使用 指针 为该地址赋值 , 即可实现 C++ 中三目运算符的效果 , C++ 编译器 就是实现的如下操作 , 返回地址 然后为 地址赋值 ;


代码示例 :

#include 

int main() {  
    int a = 10;  
    int b = 20;  
	
	// 尝试 为 三目运算符 表达式赋值
	// 该行代码直接报错
    //(a > b) ? a : b = 30;

    // 使用三目运算符获取 a 和 b 中的最大值 
    // 并且为 最大值变量 再次赋值 为 30
	// 令 三目运算符 返回 变量的地址
	// 然后使用 指针 为该地址赋值
	// 即可实现 C++ 中三目运算符的效果
	// C++ 编译器 就是实现的如下操作 , 返回地址 然后为 地址赋值
    int max = *((a > b) ? &a : &b) = 30;

    printf("Maximum value : %d\n", max);
    printf("a = %d , b = %d\n", a, b);	
  
    return 0;  
}

执行结果 :

C:\Users\octop\Desktop>gcc hello.c

C:\Users\octop\Desktop>a.exe
Maximum value : 30
a = 10 , b = 30

C:\Users\octop\Desktop>

【C++】C++ 语言对 C 语言的加强 ④ ( C 语言中的三目运算符 - 不能作为左值 | C++ 语言中的三目运算符增强 | C 语言中三目运算符作为左值使用 )_第4张图片

你可能感兴趣的:(C++,c++,c语言,三目运算符)