编译器跳转功能if,否则如果

时间:2018-02-18 20:03:37

标签: c

我正在尝试解决一个问题:当我使用我的函数时,编译器会跳过调用它。 我尝试在调试器中单步执行我的程序,但它跳过函数调用跳转。

为什么跳过函数调用?

我这样做:

void VoltageToPercent(short int Voltage, short int output){

 if((Voltage < 400) | (Voltage > 300)){
    output = 10;
 }
 else if((Voltage > 700)|(Voltage < 850)  ){
    output = 20;
 }
 else if((Voltage > 1100)|(Voltage < 1300) ){
    output = 30;
 }
 else if((Voltage > 1400)|(Voltage < 1800)){
    output = 40;
 }
 else if((Voltage > 1900)|(Voltage < 2200) ){
    output = 50;
 }
 else if((Voltage > 2300)|(Voltage < 2700) ){
    output = 60;
 }
 else if((Voltage > 2700)|(Voltage < 3100)){
    output = 70;
 }
 else if((Voltage > 3200) | (Voltage < 3600)){
    output = 80;
 }
 else if((Voltage > 3300) | (Voltage < 4100)){
    output = 90;
 }
 else if((Voltage > 4200) | (Voltage < 4600)){
    output = 100;

 }
}

2 个答案:

答案 0 :(得分:1)

代码行有两个问题,如:

pi

1)单个if((Voltage < 400) | (Voltage > 300)){ 二进制或,这不是您想要的。如果你想要一个逻辑或做|

2)然而,逻辑是错误的。它永远都是真的。您写道:&#34;如果数字小于400或大于300&#34;。所有数字都满足!所以表达式总是如此。

你可能想要逻辑和||),如:

&&

答案 1 :(得分:1)

这里有些不对劲。首先,正如sg7所说,你正在使用二进制OR,而不是你应该使用的逻辑OR ||。不同的是二进制OR将取位,并对它们应用OR运算。例如:

(01001) | (01010)

将导致

01011

但你想要的是逻辑运算符。因此,您只需添加另一个管道,使其看起来像Voltage > 5 || Voltage < 10

但是,我猜你的程序,你不想问它是否大于700或小于850,而是它是否大于700且更少而不是850.我猜你在做什么,它的跳过是第一次操作将永远解决为真。无论您选择什么号码,它总是小于400,或大于300。

所以你想要的是if(Voltage < 400 && Voltage > 300)

每当你遇到这些问题时,只需插入一个号码并亲自浏览一下程序,答案就会非常明显!

希望这有帮助。

编辑:以下是很多可以帮助你的C运营商:https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Logical_operators