c语言位运算会不会改变原变量的值

2020-11-25 14:13:26 字数 5975 阅读 3820

1楼:abc小鸭

位运算不会

改变原变量的值。要改变原变量的值需要经过赋值表达式实现。

~取反,0取反是1,1取反是0

《是左移,比如1<>右移,类似左移,数值大小除以2的n次方&按位与,1与任意数等于任意数本身,0与任意数等于0,即1&x=x,0&x=0

|按位或,x|y中只要有一个1则结果为1

^按位异或,x^y相等则为0,不等则为1

2楼:匿名用户

不会改变的,除非你这样 m= (unchar) (m>>2);

如此m的值才会改变,你可以单步执行看看结果

3楼:匿名用户

会改变例如:m=17二进制是00010001有移两位是00000100低位舍去无符号时高位补零右移n位相当于除以2^n

4楼:匿名用户

不会,将m赋比人,是不会改变的

c语言 菜鸟问题 操作数的位运算不改变原操作数的值

5楼:

就像有赋值语句 a=2;

然后左移两位 a<<2;

a还是2

并没有变成 8

在c语言中什么情况下变量的值会发生改变

6楼:无声的硝烟

既然是变量,就都可能会变。你让它作加减乘除,当然就会变了。

你是想问变量的域吗?

函数体(包括main函数)中定义的变量的有效期一般只在函数中有效,也会在函数每次被调用时临时分配空间作为变量。函数结束后,变量对应的空间会被释放(虽然有些编译器不管这些,仍然能够通过指针访问到原数据,但是这是不安全的)。而static类型的变量只在函数第一次被调用时初始化,之后的调用将不再会初始化该变量

关于实参与形参:

c语言传递参数时,基本类型变量传递的仅仅是值,对应主函数体中的内存是不会被调用的函数直接访问的。(指针那里的swap那个例子很说明问题)。比如主函数里面定义了一个a,调用的函数参数里面有个a,然后主函数“把a传进”调用的函数中——这种理解是错误的,应该是将a的值传递到调用函数私有的一个变量a中(也就是有两个a)。

还有不懂的再问吧

7楼:匿名用户

通过变量名给变量赋值,如: inta;a=5;

通过指向该变量的指针,给指针所指向的数据进行赋值。

如:inta,*pa=&a;*pa=5;

和2本质上是一样的,那就是通过指针,对该变量所占用的存储单元赋值。

如: intb[3], a, *pb=b+3;*pb=5;//这里似乎pb并没有指向a,但b+3实际上已经是a的地址了。缓冲区溢出也就是这种情况。

在c语言中关于位运算a<<2这个表达式运算后,a的值有没有变?

8楼:黑丶雨

<< 只是个运算符号

,就和 + - * / 的性质一样;

就如 a + 2; 这条语句执行后并没有改变 a 的值,a只是参回与了其中的过答程;

除非把 a + 2 赋与 a ,如:a = a + 2,这样才会改变 a 的值;

同样的a << 2;这条语句中a也只是参与了过程,并不会改变a的值;

只有这样 a = a << 2 才会改变 a 的值;

9楼:匿名用户

没有,并没有对变量a进行赋值

c语言中强制类型转换后原变量值和数据类型不变 对吗?

10楼:听不清啊

强制类型转换是把变量从一种类型转换为另一种数据类型。

这话完全正确。

例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型。但这只适用于本次使用,原变量的类型及其中的值都不会发生变化。

扩展资料:

举例说明

使用强制类型转换运算符把一个整数变量除以另一个整数变量,得到一个浮点数:

#include int main()

当上面的**被编译和执行时,它会产生下列结果:

value of mean : 3.400000sum=17

11楼:yx陈子昂

对的,表达式的值和类型变了,但不会影响原变量

c语言中,一个变量的值进行减运算后,这个值的内存地址也变化了。是吗?

12楼:su9_踏雪无痕

内存地址是不会发生变化的,只是存储在这块内从中的值发生了改变。如果想让内存地址发生变化需要对内存进行操作。

例如:cha a[8] = "abcde";

char *p;

p = a; //指针p指向数组a的首地址p++; //此时用p对a的内存进行操作,每相加一下内存向后移1个byte。p指向的地址变了

,但 是 a的地址照样没有变

13楼:匿名用户

不变c语言中,对变量的值进行运算,变量在内存的地址不会改变,改变的是地址对应该的数据。

14楼:匿名用户

不变,只是变量内存中所存的内容改变,减运算后的结果(值)仍然存在原地址中。。。

15楼:匿名用户

没有啦,取出内存地址中的变量进行减运算后又把值存放到内存地址中。

16楼:匿名用户

没有变,你是不是看到的是指针。比如

int*ptr,a[10];

ptr =a;

ptr++;

这个ptr的值会变

c语言位运算,怎样修改每一位的值呢?

17楼:童年的秋天

ch | = (1<<3)

1左移3位 再和ch按位或就好了拉

要置0的话 就

ch & = ~ (1<<3)

18楼:

就三种情况,以单字节为例说明:

将某一位置1,无论原来是0是1,操作后肯定是1,“按位或(即操作符'|')”一个该位为1,其余位为0的单字节数。如a=00001000,b=000000010,则a | b=00001010,即把第1位变成1了。注意位数从右至左是0~7。

将某一位置0,无论原来是0是1,操作后肯定是0,“按位与(即操作符'&')”一个该位为0,其余位为1的单字节数。如a=00001010,b=11111101,则a | b=00001000,即把第1位变成0了。

将某一位变反,即原为1时变为0,原为0时变为1,“按位异或(即操作符'^')”一个该位为1,其余位为0的单字节数。如a=00001000,b=000001000,则a | b=00000000,即把第3位变反为0了。

这里的举例以一次改变1位为例,实用中可以同时改变多位,要改变的每一位都遵从以上规则。

19楼:匿名用户

这个就要用到位运算了

比如lz说的,就应该是ch^(1<<2)

用二进制表示的话,就是

0000 0000 0000 0001 <<20000 0000 0000 0100

然后0000 0000

^ 0000 0100

----------------

0000 0100

20楼:匿名用户

假如你让一个数的第n位变为1则让该数与2的n-1次方 做位或运算比如你要第三位变为1

那么就让它与4相或 就可以了

这个第几位是从右向左数的

21楼:

使用|和&运算符

回答过于简单,请适当进行补充,这是什么鬼?

说的密密麻麻的才是好答案?

一边玩去。。。

22楼:匿名用户

unsigned i=1;第n位;

ch^=(1<

23楼:匿名用户

位运算符有| & << >>

c语言中,怎样不用中间变量而互换两个变量的值呢?

24楼:东师陈老师

有两种方式可以不使用中间变量,交换同类型的变量a,b的值:

1 .使用加法操作

a+=b;

b=a-b;

a -= b;

2 .使用异或操作:

a^=b;

b^=a;

a^=b;

c语言运算符是说明特定操作的符号, 它是构造c语言表达式的工具。c语言的运算异常丰富,除了控制语句和输入输出以外的几乎所有的基本操作都为运算符处理。

除了常见的三大类,算术运算符、关系运算符与逻辑运算符之外,还有一些用于完成特殊任务的运算符,比如位运算符。

25楼:隽高爽集豆

对于整数的确可以像楼上几个同学说的进行交换,但是这只是对于整数这个特殊情况,对于一般意义的量,比如指针类型,除非深入了解各种变量的计算机内部表示,否则只能通过中间变量来交换两个变量的值。而且从效率的角度来说,通过一个中间变量交换只是增加了一个空间开销,即使是两个整数交换的情况,通过中间变量交换也是最明智的选择,因为对整数交换的特殊方法只能注定程序的运行效率不高。

这个问题提的有想法。但是事实是目前我们实现交换两个变量的最好方法就是通过一个中间变量,虽然对于某些变量有些特殊的技巧使它们不通过中间变量实现,但是运算量大,代价远不如通过中间变量。

26楼:线雅青易尧

好像这样不行,使用中间变量来互换两个变量值是大部分编程语言的算法,这个算法不仅在c语言中可以这样运用,在java语言中也中也是这么用的(java是比较高级的语言),不过真想这么做,你可以自定义一个函数,不用中间变量就可以交换。但是自定义函数中还是用到第三变量

27楼:长孙慧俊塞豪

可以啊。

一:int

a,b;

a=10;

b=1;

a=a^b;

b=a^b;

a=a^b;

结果:a=1;b=10;

^是异或运算;

二;int

a=10,b=20;

a=a+b;

b=a-b;

a=a-b;

结果:a=20;b=10;

28楼:

#include

void main()

关于c语言位运算,赋值的问题,回答详细一点。为什么按位取反后输出的结果不一样?

29楼:匿名用户

~val 可以理解成一个右值,%d 表示~val默认为int型 自然就是-3了

newval = ~val; 等于是强制转换了类型, newval是无符号char 自然就是0xff-2= 253

%hhd 表示是一个可以把int型当成unsigned char输出 自然也是253

30楼:匿名用户

2的二进制是00000010,取反得到11111101,最高位为1,说明这是个负数的补码。负数的补码,是由其绝对值的原码取反加1得到,反过来,将负数的补码减1取反,就得到其绝对值的原码。11111101-1=11111100,再取反得到00000011,即十进制的3。

也就是说该负数的绝对值为3,那么这个负数为-3。

所以第一个值是-3

整型的每一种都分有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。

你声明变量无符号,将二进制转换无符号在转换十进制,导致最高位由原来的符号位变成了有效数字位了,参与转换

所以最后结果是253

你去掉前面的unsigned 两个值应该是一样的