与它们相关联的值错误的全局变量

问题描述

我制作了这个头文件,它应该让我更容易使用 printf 进行颜色和格式化,但不知何故,格式化的所有参数都来自我可以告诉的认情况下 active(=1),尽管我已经定义了它们关闭(= 0)。将 .c 文件中的它们更改为关闭也不会改变任何内容

#include <stdio.h>

//parameters
short print_bold = 0;//1
short print_LessVisible = 0; //2
short print_cursive = 0;//3
short print_underline = 0;//4
short print_blinking = 0;//5
short print_SwapBackground = 0; //7
short print_SameBackground = 0;//8
short print_crossed = 0;//9
short print_LineOver = 0; //53
short print_HighIntensity = 0;

void text_color(unsigned short color){;
  short print_mode_1 = (print_bold = 1);
  short print_mode_2 = 2 * (print_LessVisible = 1);
  short print_mode_3 = 3 * (print_cursive = 1);
  short print_mode_4 = 4 * (print_underline = 1);
  short print_mode_5 = 5 * (print_blinking = 1);
  //print_mode_6 = print_mode_5
  short print_mode_7 = 7 * (print_SwapBackground = 1);
  short print_mode_8 = 8 * (print_SameBackground = 1);
  short print_mode_9 = 9 * (print_crossed = 1);
  short print_mode_53 = 53 * (print_LineOver = 1);


  int color_value = 30 + color * (color < 8) + 60 * (print_HighIntensity = 1);

  printf("\e[%d;%d;%d;%d;%d;%d;%d;%d;%d;%dm",print_mode_1,print_mode_2,print_mode_3,print_mode_4,print_mode_5,print_mode_7,print_mode_8,print_mode_9,print_mode_53,color_value);
}

void background_color(unsigned short color){
  int color_value = 40 + color * (color < 8) + 60 * (print_HighIntensity = 1);
  printf("\e[%dm",color_value);
}

解决方法

您将比较运算符 == 与赋值运算符 = 混合使用。分配 print_bold = 1 后,它必须是 1,而不是 0

 printf("%d\n",print_bold); // 0
 short print_mode_1 = (print_bold = 1);
 //                             ^^^ - assignment
 //                ^^^ - assignment
 printf("%d\n",print_bold); // 1

分配的结果就是分配的结果。 print_mode_1 = (print_bold = 1); 等于:print_bold = 1; print_mode_1 = 1

=== 混用是一个非常非常常见的错误,经常发生。如果要比较而不是分配,请将 = 更改为 ==

,

在初始化 print_mode 变量和 color_values 时,我使用了 =,就好像它是一个像 这样的运算符。我将 print_mode_x = x * (print_parameter = 1) 更改为 print_mode_x = x * (print_parameter == 0) 。我使用无分支编程的原因是它允许我编写更少的代码行(而且实际上速度也更快)。