小编may*_*aya的帖子

C:如果x是char类型,x = ~x会发生什么(详细)?

如果我们有以下代码:

char x = -1;
x =~x;
Run Code Online (Sandbox Code Playgroud)

在带有MS VS编译器的x86平台上(部分支持C99) - 运行时会发生什么?

据我所知,发生以下情况(如果我错了请纠正我):

  • x被赋值-1,由位模式0xff表示,因为char由一个字节表示.
  • 〜运算符将x提升为int,也就是说,它在内部使用位模式0xffffffff.
  • 〜运算符的结果是0x00000000(类型为int).
  • 要执行分配,整数促销适用(主要).因为在我们的例子中,右侧的操作数是一个int,所以不会发生转换.左侧的操作数转换为int.赋值的结果是0x00000000.
  • 作为副作用,赋值的左侧被赋值为0x00000000.由于x是char类型,因此还有另一个隐式转换,它将0x00000000转换为0x00.

实际上发生了很多事情 - 我发现它有点令人困惑.特别是:我对最后一次隐式转换(int到char)的理解是否正确?如果赋值的结果无法存储在char中会发生什么?

c operators type-conversion

4
推荐指数
1
解决办法
112
查看次数

C99:fscanf()设置eof早于fgetc()是标准的吗?

我尝试在64位Windows PC上使用VS2017(32位版本),在我看来,fscanf()在成功读取文件中的最后一项后立即设置eof标志.在fscanf()读取与流相关的文件中的最后一项后,此循环立即终止:

while(!feof(stream))
{
    fscanf(stream,"%s",buffer);
    printf("%s",buffer);
}
Run Code Online (Sandbox Code Playgroud)

我知道这是不安全的代码......我只是想了解这种行为.请原谅我 ;-)

这里,stream与包含"Hello World!"等字符串的普通文本文件相关.该文件中的最后一个字符不是换行符.

但是,fgetc()在处理完最后一个字符后,尝试在此循环中读取另一个字符,这导致c = 0xff(EOF):

while (!feof(stream))
{
    c = fgetc(stream);
    printf("%c", c);
}
Run Code Online (Sandbox Code Playgroud)

fscanf()和fgetc()的这种行为是标准化的,依赖于实现还是其他什么?我不是问为什么循环终止或为什么它不终止.如果这是标准行为,我对这个问题很感兴趣.

c scanf eof

3
推荐指数
1
解决办法
148
查看次数

标签 统计

c ×2

eof ×1

operators ×1

scanf ×1

type-conversion ×1