在特定情况下,C程序中会跳过某些语句

时间:2016-07-25 11:35:28

标签: c netbeans

我正在使用NetBeans IDE中的C应用程序,应用程序基本上是客户端 - 服务器模型。我根据来自客户端的数据计算一些值,但在特定情况下,值计算失败。而不是将值返回为65536,而是将值设为256。

以下是这种情况:

int pckt_number = 0; //size of int is 4 bytes.

        pckt_number = 0 << 8 ; // 1

        pckt_number |= 1 << 8; //2

        pckt_number |= 0 << 8 ; //3

        pckt_number |= 0; //4

此处从执行中跳过第3和第4个语句,并且返回值为256而不是65536.对于其余的情况,从1到65535计算正确的值。请注意int是4个字节。

3 个答案:

答案 0 :(得分:5)

让我们看看会发生什么:

int pckt_number = 0;     // 0
pckt_number |= 0 << 8;   // pckt_number = pckt_number | 0    --> still 0
pckt_number |= 1 << 8;   // pckt_number = pckt_number | 256  --> 256
pckt_number |= 0 << 8;   // pckt_number = pckt_number | 0    --> still 256
pckt_number |= 0;        // pckt_number = pckt_number | 0    --> still 256

最后两个陈述根本不采取任何行动。它们不会被“跳过”。第一行pckt_number |= 0 << 8也没有做任何事情。

答案 1 :(得分:2)

age评估为pckt_number |= 0 << 8 pckt_number |= (0 << 8)

对于任何 pckt_number |= 0

x | 0x。因此x是无操作。

因此,您标记为x |= 0//3的陈述均为无操作。

答案 2 :(得分:1)

Rudy Velthuis's answer完美地解释了这一点。如果我理解正确的话你可以这样做。

int pckt_number = 0;     // 0
pckt_number |= 0 << 24;  // most significant byte,  
pckt_number |= 1 << 16;  // second most significant byte,
pckt_number |= 0 << 8;   // third most significant byte,
pckt_number |= 0;        // least significant byte,