C语言表示逻辑量例子,有意思的C语言运算符

在C语言中,运算符用于执行程序代码运算,会针对两个或者两个以上操作数进行运算。比如:5 - 2,它的操作数是 5 和 2,而运算符则是 “-”。常见的运算符可大致分为 4 种类型:算术运算符、关系运算符、赋值运算符和逻辑运算符;它优先级从低到高的顺序为: 赋值运算符 < 逻辑运算符 < 关系运算符 < 算术运算符;下面对这4种类型一一讲解。

1、赋值运算符

赋值运算符可分为简单赋值、复合算术赋值和复合位运算赋值。

1、1 简单运算符只有一个 “=”,它的用法可用如下例子表示:

int n = 2;

1、2 复合算术赋值运算符有 5 个,分别为 “+=”, “-=”, “*=”, “/=”, “%=”,它们的用法可用如下例子表示:

int j = 1;

j += 2; //等同于 j = j + 2,表示j的值加 2 后再赋值给j

j -= 2; //等同于 j = j - 2,表示j的值减 2 后再赋值给j

j *= 2; //等同于 j = j * 2,表示j的值乘以 2 后再赋值给j

j /= 2; //等同于 j = j / 2,表示j的值除以 2 后再赋值给j

j %= 2; //等同于 j = j % 2,表示j的值除以 2 后再赋值给j

1、3 复合位运算赋值运算符有 5 个,参与运算的量,按二进制位进行运算,分别是 “&=”, “|=”, “^=”, “>>=”, “<<=”,它们的用法可用如下例子表示:

int y = 2; //相应的二进制数为0b10

int num = 1; //相应的二进制数为0b01

y &= num; //等同于 y = y & num,此时int类型y的值为0,二进制y的值为0b0

y |= num; //等同于 y = y | num,此时int类型y的值为3,二进制y的值为0b11

y ^= num; //等同于 y = y ^ num,此时int类型y的值为3,二进制y的值为0b11

y >>= num; //等同于 y = y >> num,表示y向右移num位再赋值给y,此时int类型y的值为1,二进制y的值为0b01

y <<= num; //等同于 y = y << num,表示y向左移num位再赋值给y,此时int类型y的值为2,二进制y的值为0b10

2、逻辑运算符

逻辑运算符有 3 个,它们分别是 “&&”、“||” 和 “!”,“!” 表示非,取反的意思;在这里拓展一个知识点,在 C 语言中,用表达式等于0表示布尔值的假(0),用不等于0的表达式表示布尔值的真(1);逻辑运算符的用法可用如下例子所示:

int j,j2,j3 ;

int k = 20;

j = (3 - 4) && (k = 2); //(3 - 4)等于-1,视为真;(k = 2)中k等于2,视为真,所以j为真,j = 1

j2 = (0) || (k = 2); //(0)为假,(k = 2)中k等于2,视为真;所以j2就为真,j2 = 1

j3 = !k; //k的值为2,视为真,!k就为假,所以j3为假,j3的值为0

用代码做例子后,我们进行一下总结,“&&” 逻辑运算符左右两边的表达式都为真时,那么整个表达式就为真,否则为假;如果 “&&” 逻辑运算符左边的表达式为假时,右边的表达式就不会执行。“||” 逻辑运算符左右两边的表达式至少有一个为真时,整个表达式就为真,否则为假;如果 “||” 逻辑运算符左边的表达式为真时,右边的表达式不会执行。

3、关系运算符

关系运算符有 6 个,分别是 “>”、“=”、“<=”、“!=”,它们一般用于 2 个或者 2 个以上数据作比较;它们的用法可用如下例子所示:

int a,b,c,d,e,f;

a = 3 > 4; //3不大于4,所以a为0

b = 4 < 5; //4小于5,所以b为1

c = 4 == 4;

d = 5 >= 3;

e = 7 != 8;

f = 10 <= 12;

4、算术运算符

算术运算符有 7 个,它们分别是 “+” 、“-” 、“” 、“/”、 “%” 、“++” 和 “--”,由于 “+” 和 “-” 都比较简单,所以只对 “” 、“/”、 “%” 、“++” 和 “--” 进行讲解;举例之前先拓展一个知识点,C语言的基本数据类型的优先级为 byte,short,char—> int —> long—> float —> double,byte、short 和 char 这 3 个为同一级别;"*" 表示乘法运算符,“/” 为除法运算符,“%” 为求余数运算符,“++” 为自增运算符,“--”为自减运算符,它们的用法可用如下例子表示:

int num = 3 * 4;

int num2 = 16 / 5; //num2 为3

16 / 5.0 ; //此表达式的值为 3.20000

16.0 / 5 ; //此表达式的值为 3.20000

-13 / 4 ; //此表达式的值为 -4

4 * 8.0 ; //此表达式的值为 32.0000

13 % -3 ; //此表达式的值为 1

-13 % 3 ; //此表达式的值为 -1

num2++ ; //等同于 num2 = num2 + 1

num2-- ; //等同于 num2 = num2 - 1

根据以上算术运算符的例子,可总结一些结论:

(1)除法的运算结果和运算对象的数据类型有关系,被除数和除数只要有一个优先级较高的数,则商的数据类型就是优先级较高的类型,比如 16.0 / 5, 16.0 为double类型,5 为int类型,double 的类型较高,所以它们的商为double类型。

(2)取余的运算对象必须是整数,结果是整除后的余数,余数的符号与被除数符号相同,比如 13 % -3, 13 是被除数也是正数,所以余数也是正数。

(3)乘法的运算结果和运算对象的数据类型有关系,乘积表达式只要有一个数的类型优先级较高,那么它的积的类型和乘数优先级最高的类型相同,比如 4 * 8.0, 4是 int 类型,8 是 double 类型,double 类型比较高,所以积为 double 类型。

本篇文章就写到这里就结束了,由于本人技术水平有限,文章中难免会有出错,欢迎批评指正,谢谢大家的阅读。

<think>嗯,用户这次问的是C语言中形参与实参重名的问题,特别关注选项C的错误原因。用户之前还问过指针运算符和<号的问题,看来是在系统学习C语言的底层机制。从用户提供的引用来看,ta已经掌握了全局变和局部变重名的规则(引用[3]),也接触过形参与全局变重名的例子(引用[2])。现在ta的困惑点在于:形参和实参本身重名是否合法?这个问题其实涉及到C语言的标识符作用域规则。用户给的示例代码很有意思:引用[1]中main函数和test函数都定义了i,j,这完全合法因为它们是不同函数的局部变。而引用[2]展示的func(int*arr)形参arr遮盖了全局arr,这正是作用域链的典型表现。不过用户真正想问的应该是func内部同时存在形参arr和实参temp的情况——但这不可能发生,因为实参在调用时就已经求值了。需要特别注意术语的精确性:"形参与实参重名"这个说法本身不准确,因为它们根本不在同一个作用域。形参的作用域在其函数体内,而实参是调用处的表达式。就好比写信时收件人和寄件人都叫张三,但邮局依然能正确处理,因为他们处在邮件系统的不同位置。关于错误选项C,用户可能看到过类似"形参和实参重名会导致编译错误"的选项。这完全是误导,实际编译器根本不会检查这种跨函数命名冲突。C语言标准明确规定函数参数属于块作用域(§6.2.1.4),与外部变无关。用户的学习路径很清晰:从变作用域->函数作用域->现在深入到参数传递机制。下次可能会问到更复杂的函数指针或者可变参数列表,可以提前准备相关示例。不过当前需要先帮ta夯实基础概念,特别强调"重名"在不同上下文中的实质差异。</think> 在C语言中,**形参与实参重名不会导致编译错误或运行时错误**,但需要理解其作用域规则,以下是详细解析: --- ### 一、形参与实参的规则解析 1. **作用域隔离原则** - **形参**:属于函数的局部变,作用域仅限函数体内。 - **实参**:属于调用处的变,作用域在函数外部。 ```c void func(int a) { // 形参a是函数内的局部变 a = 100; // 修改的是局部副本 } int main() { int a = 10; // main函数的局部变a func(a); // 实参a的值(10)被拷贝给形参 printf("%d", a); // 输出10(实参未被修改) } ``` 2. **重名时的处理逻辑** - **编译通过**:形参和实参允许同名(如都命名为 `a`),编译器会根据作用域区分。 - **无冲突**: - 函数内访问的 `a` 是**形参**(局部变) - 函数外访问的 `a` 是**实参**(外层变) - **数据传递机制**:实参的值通过**拷贝**传递给形参(传值调用),二者占用不同内存地址[^1]。 --- ### 二、选项C的错误原因分析(常见误解) 若题目声称「形参和实参重名会导致编译错误」,则错误原因如下: - **违反C语言标准**:C标准允许同名(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值