我们知道任何不相等的数字0都被视为trueC,所以我们可以写:
int a = 16;
while (a--)
printf("%d\n", a); // prints numbers from 15 to 0
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否将真/假定义为C中的1/ 0,所以我尝试了下面的代码:
printf("True = %d, False = %d\n", (0 == 0), (0 != 0)); // prints: True = 1, False = 0
Run Code Online (Sandbox Code Playgroud)
请问C标准明确指示的真正的真值和假的1和0分别?
我首先在Windows上用Ansi C编写了一个小程序,然后我在Ubuntu上用内置的GCC编译它.
该计划很简单:
scanf().但奇怪的事情发生了.当我尝试移动光标时,它会打印四个字符:

如何避免这种情况?
为什么打印这4个字符而不是移动光标?
假使,假设
int array[16];
Run Code Online (Sandbox Code Playgroud)
有标准转换称为数组到指针转换,因此array会隐式转换为类型int*,但为什么&array等于array?
例如,
int array[16];
void *p = array;
void *q = &array;
printf("%p\n", p);
printf("%p\n", q);
Run Code Online (Sandbox Code Playgroud)
这将给出相同的地址和没有编译错误.
为什么?
我有一个透明的,水印般的应用程序,用C语言写的XLib.目前,如果你点击应用程序的任何地方没有任何反应,但我希望它将鼠标输入传递给它下面的任何东西.例如,如果单击X关闭应用程序下方的窗口,它应该关闭应用程序,而不是什么都不做.
逗号运算符具有最低优先级和从左到右的关联性,因此这保证了以下顺序:
i = ++j, j = i++;
Run Code Online (Sandbox Code Playgroud)
i将是2,然后j在此声明之后将是1,如果i并且j首先都是0.
但是,C中的类型定义中的逗号分隔符是否也保证了顺序?如
int i = 1, j = ++i;
Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
#include <stdlib.h>
#include <windows.h>
/// Global Variables
HANDLE ConsoleHandle;
int RGB (int R, int G, int B); // line 8
int Set_Color (int RGB_Fore, int RGB_Back);
int main (void)
{
// Get Handle
ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
char Str [32] = "Happy New Year.\n";
printf("%s", Str);
system("pause>nul");
return 0;
}
int RGB (int R, int G, int B) // line 21
{
return (R*4 + G*2 + B);
}
int Set_Color (int RGB_Fore, int RGB_Back)
{
SetConsoleTextAttribute(ConsoleHandle, RGB_Fore*8 + …Run Code Online (Sandbox Code Playgroud) #include <conio.h>
int main (void)
{
for (;;)
{
unsigned char ch = getch();
printf ("0x%02X\n", ch);
}
}
Run Code Online (Sandbox Code Playgroud)
我想获得扫描码.
以下是维基百科的描述:
Reads a character directly from the console without buffer, and without echo.
Run Code Online (Sandbox Code Playgroud)
当我按下时Del,它显示0xE0 0x53.
当我按下Ctrl+时PgUp,它显示0xE0 0x86.
虽然有些与表格相同,但它显示的大部分值都与之不同.
那么,getch()真的能获得扫描码吗?
这是扫描码表(第2组,最常用)
我正在学习(ANSI)C 语言编程语言(第2版).
这是2.10赋值运算符和表达式的代码片段:
1 /* bitcount() counts the number of 1-bits in its integer argument */
2 int bitcount(unsigned x)
3 {
4 int b;
5 for (b = 0; x != 0; x >>= 1)
6 if (x & 01)
7 b++;
8 return b;
9 }
Run Code Online (Sandbox Code Playgroud)
我很困惑,为什么x & 01写在第6行而不是x & 1或x & 0x1?是0之前1有必要吗?
printf("%d\n", (unsigned char)255 * (unsigned char)255);
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是65025但不是1(255*255(mod 256)).为什么?
由于严格的别名可能有助于编译器更好地优化,因此C99引入了restrict关键字,如果程序员保证不会通过指向不同类型的指针访问它,则可以将其用作变量的限定符.但是,由于多种原因,不同类型之间的类型转换是不可避免的,这将使编译器假定一个指针不是另一个指针的别名.因此,变通方法是通过传递-fno-strict-aliasing(GCC标志)来禁用全局严格别名优化.这完全没有意义,因为可能只有两个指针不应该完全优化.因此,为什么不引入一个相反的关键字restrict,告诉编译器不要假设这两个指针指向不同的地址.这有点类似于什么volatile,并告诉编译器这个变量被大大改变,所以以特殊的方式对待它们.是否可以创建这样的关键字?
编辑:有一种方法可以解决这个问题.请参阅下面的yano评论.