このコードへの出力を説明してください:[閉じ] -- c フィールド と if-statement フィールド 関連 問題

Please explain the output to this code: [closed]












-6
vote

問題

日本語

この質問を改善したいですか? ON-TOPIC スタックオーバーフローでは、質問を更新します。

閉じられた 3年前

この質問を改善します <事前> <コード> #include<stdio.h> void main() { if(0xA) if(052) if('xeb') if('12') //what do the above 3 statements mean? printf("Hello World!") else; else; else; else; }

出力: こんにちは世界!

だからここで、052、 XEBと 012の意味は何ですか? 他の複数のステートメントの重要性は何ですか?

英語
#include<stdio.h> void main() {    if(0xA)    if(052)                  if('xeb')    if('12')              //what do the above 3 statements mean?    printf("Hello World!")    else;    else;    else;    else;  } 

Output: Hello World!

so here, what is the meaning of 052, xeb and 12? And what is the significance of the multiple else statements?

</div
     
         
         

回答リスト

0
 
vote
vote
ベストアンサー
 

これはトリックな質問です。おそらく誰かがあなたがそれから何かを学ぶことができると思った。おそらくこの人は自転車に乗るために子供に教える良い方法は自転車のタイヤを平らにすることであり、その途中で大きな岩を入れて、それは「キャラクターを築く」ので、子供たちに大きな突き出しを与えることであると考えています。そして、あなたがそれらの障害物にもかかわらず自転車に乗ることを学ぶことができれば、あなたは最終的には本当に良いバイクライダーになるでしょう。しかし、私は掘ります。

とにかく、これはそのコードで何が起こっているのかについての説明です。

0xA は16進定数です。それは値0a 16 、または10(基数10)を有する。
<コード> 052 は8進定数です。それは値52 8 、または42(基数10)を有する。
<コード> 'xeb' は16進文字文字定数です。値は、値EB 16 、または235(Base 10)(ISO-8859-1では、UnicodeがIT上に2つのドットを持つEで終わると、†)の文字です。
'12' は、通常の8進文字定数です。値12 8 、または10(Base 10)の文字である(ASCIIでは、Newline文字、<コード> ' ' )。

あなたが言うとき

<事前> <コード> if( expr )

cでは、ゼロ以外の場合は「true」と見なされます。またはゼロの場合は "false"と見なされます。言うまでもなく、これらの定数のうちの4つすべてはゼロ以外のものです。

C内の if ステートメントの全構文は

です。 <事前> <コード> if( expr ) statement-or-block

または

<事前> <コード> if( expr ) statement-or-block else statement-or-block

ここで、 statement-or-block は単一のステートメント、または複数のステートメントの「ブロック」(シーケンス)のいずれかです。<コード> 9988766610 。

Cのほとんど使用されていない構文は「空の文」です。何も持っていない場合はセミコロンが続く場合、それは空のステートメントです、そしてそれは何もしません。

丁寧な円では、その構造を描くためにあなたのコードをインデントするための必須と考えられます。だからこのコードを提示する通常の方法は次のとおりです。

<事前> <コード> 0521

と繰り返しになると、4つの式はすべて「TRUE」に評価します。だから、このコードは「真の場合はtrueの場合、trueの場合はtrueの場合は「こんにちは世界!」を印刷していない、そうでなければ何もしない、そうでなければ何もしない、そうでなければ何もしません。 "< / P>

それはかなり愚かに聞こえるように言いました、私は知っています。そして実際には、それは英語のようにCで愚かなだけです。

p.S。静かに修正された投稿としてのコードに関するもう1つの問題は、<コード> 0523 として宣言されていることです。丁寧な円で、そして本の妥当性については、このコードが出身している本の妥当性についてさらに疑問を投げます。

 

This is a trick question. Presumably someone thought you could learn something from it. Presumably this person also thinks that a good way to teach a child to ride a bicycle is to flatten the bicycle's tires, and put large boulders in the way, and randomly give the child a rough shove to the side, because it "builds character", and if you can learn to ride a bicycle in spite of those obstacles, you will eventually be a really good bike rider. But I digress.

Anyway, here's an explanation of what's going on in that code.

0xA is a hexadecimal constant. It has the value 0A16, or 10 (base 10).
052 is an octal constant. It has the value 528, or 42 (base 10).
'xe is a hexadecimal character constant. It is a character with the value EB16, or 235 (base 10) (which in ISO-8859-1 or Unicode ends up being an e with two dots over it, ë).
'12' is an ordinary, octal character constant. It is a character with the value 128, or 10 (base 10) (which in ASCII ends up being a newline character, ' ').

When you say

if( expr ) 

in C, the expression is considered "true" if it is nonzero, or "false" if it is zero. Needless to say, all four of those constants are nonzero.

The full syntax of an if statement in C is either

if( expr )     statement-or-block 

or

if( expr )     statement-or-block else     statement-or-block 

where statement-or-block is either a single statement, or a "block" (sequence) of multiple statements enclodes in braces { }.

A little-used piece of syntax in C is the "empty statement". If you have nothing, followed by a semicolon, that's an empty statement, and it does... nothing.

It is considered mandatory in polite circles to indent your code to portray its structure. So the normal way of presenting this code would be:

#include <stdio.h>  int main() {     if(0xA)         if(052)                           if('xeb')                 if('12')                     printf("Hello World!")                 else                     ;             else                 ;         else             ;     else         ; } 

And, again, all four expressions evaluate immediately to "true". So, in English, this code says "If true, then if true, then if true, then if true, then print 'Hello world!', else do nothing, else do nothing, else do nothing, else do nothing."

Phrased that way it sounds pretty stupid, I know. And in fact, it's just as stupid in C as it is in English.

P.S. Besides the bizarre and unnecessary conditionals, another problem with the code as posted, which I have quietly corrected, is that it declared main as void, which is something else that's not done in polite circles, and throws further doubt on the validity of the book this code came from.

</div
 
 
3
 
vote

C標準から(6.8.4.1 IFステートメント)

2の両方の形式で、の場合、最初の標本が実行された場合 式は、0 に等しく比較されます。他の形式では、2番目の 式が0に等しいと比較した場合、strbetatementが実行されます。 最初の置換されているラベルを介して到達し、2番目の置換は 実行されていません。

IF文の各式として

<事前> <コード> if(0xA) if(052) if('xeb') if('12')

は0に対して不均等であり、関数printfの囲まれた呼び出し(セミコロンが存在する場合)

<事前> <コード> printf("Hello World!");

が実行されます。

だからIF文は大きくない。

0xA は10進数10

に等しい16進整数定数です。

<コード> 052 は10進数42

に等しい8進整数定数です。

'xeb' は、16進位エスケープシーケンスとして指定された文字定数

です。

'12' は、8進エスケープシーケンスとして指定された文字定数

です。

C標準に従って、パラメータなしの関数<コード> 99887666 は

のように宣言されるものとする。 <事前> <コード> int main( void )

IF文の各式が0に等しくないので、プログラムは実際には次のプログラム

と同等です。 <事前> <コード> #include<stdio.h> int main( void ) { printf("Hello World!"); }
 

From the C Standard (6.8.4.1 The if statement)

2 In both forms, the first substatement is executed if the expression compares unequal to 0. In the else form, the second substatement is executed if the expression compares equal to 0. If the first substatement is reached via a label, the second substatement is not executed.

So as each expression in the if statements

   if(0xA)    if(052)                  if('xeb')    if('12') 

are unequal to 0 then the enclosed call of the function printf (provided that a semicolon is present)

printf("Hello World!"); 

is executed.

So the if statements do not make much sense.

0xA is a hexadecimal integer constant equal to decimal 10

052 is octal integer constant equal to decimal 42

'xe is a character constant specified as a hexadecimal escape sequence

'12' is a character constant specified as an octal escape sequence

Take into account that according to the C Standard the function main without parameters shall be declared like

int main( void ) 

Thus as each expression of the if statements is not equal to 0 then the program is in fact equivalent to the following program

#include<stdio.h>  int main( void ) {     printf("Hello World!"); } 
</div
 
 
0
 
vote

投稿したコードは

と同じです <事前> <コード> #include<stdio.h> int main( void ) // void main() is not a standard signature { if(0xA) { if(052) { if('xeb') { if('12') { printf("Hello World!") } else { } } else { } } else { } } else { } }

単一のステートメントしかない場合は、

を省略できます。 <事前> <コード> printf("Hello World!"); 0

として書くことができます <事前> <コード> printf("Hello World!"); 1

私や他の人は特定のケースを除いてこれを推奨します。

<コード> printf("Hello World!"); 2 ステートメント自体は単一のステートメントとしてカウントされるので、

を書くことは可能です。 <事前> <コード> printf("Hello World!"); 3

<事前> <コード> printf("Hello World!"); 4

そしてもちろん、コンパイラは刻み目を気にしないので、

<事前> <コード> printf("Hello World!"); 5

は同じことを意味します - しかし、発見したように、この方法で書かれたコードは理解するのが少し難しいです。

<コード> main16 、<コード>、<コード>、または<コード>、または<コード>、または<コード>のテスト条件は、任意のスカラータイプ(整数、浮動小数点、またはポインタ値)の場合があります。 )。 Cは明らかに異なるブール型を持ちませんでしたので、ルールはブール値のコンテキスト内のゼロ以外の値が "true"に評価され、ゼロは "false"に評価されます。

<コード> 998876619 、<コード> main21 、<コード> main21 、 0xA2 は、ゼロ以外のスカラー式です。 value( 998876623 およびは、それぞれ16進数と8進形式の整数リテラル、<コード> 0xA5 および<コード> 0xA6 はエスケープです。 16進数と8進形式で文字値を表すシーケンスであるため、すべての 0xA7 ステートメントの本体が実行されます。

4つのネスト<コード> 0xA8 ステートメントを持ち、最も内側のものだけがおもしろいことをしています。 <コード> 0xA9 句は空で、完全に省略することができます。

<事前> <コード> 0520

と私が上述したように、中括弧も省略されるかもしれません:

<事前> <コード> 0521

全てが

に減少する <事前> <コード> 0522

合理的にスマートコンパイラは、 0523 ステートメントのマシンコードを生成することはありませんが、のようにマシンコードを生成する必要があります。 。

 

The code you posted is equivalent to

#include<stdio.h>  int main( void ) // void main() is not a standard signature {    if(0xA)    {      if(052)        {                    if('xeb')        {          if('12')                    {                printf("Hello World!")          }          else          {          }        }        else        {        }      }      else      {      }    }    else    {    } } 

Curly braces can be omitted if there is only a single statement within them:

if ( a ) {   do_something(); } 

can be written as

if ( a )   do_something(); 

although I and others recommend against doing this except in specific cases.

An if statement itself counts as a single statement, so it's possible to write

if ( a ) {   if ( b )     do_something(); } 

as

if ( a )   if ( b )     do_something(); 

And, of course, the compiler doesn't care about indentation, so

if ( a ) if ( b ) do_something(); 

means the same thing - however, as you've discovered, code written this way is a little hard to understand.

The test condition of an if, while, or for may be any scalar type (integer, floating-point, or pointer value). C didn't originally have a distinct Boolean type, so the rule is any non-zero value in a Boolean context evaluates to "true", while zero evaluates to "false".

Each of 0xA, 052, 'xe, and '12' is a scalar expression with a non-zero value (0xA and 052 are integer literals in hexadecimal and octal format, respectively, while 'xe and '12' are escape sequences representing character values in hex and octal format), so the bodies of all the if statements are executed.

You have four nested if statements, and only the innermost one is doing anything interesting. The else clauses are empty and can be omitted entirely:

#include<stdio.h>  int main( void )  {    if(0xA)    {      if(052)        {                    if('xeb')        {          if('12')                    {                printf("Hello World!")          }        }     } } 

And, as I said above, the curly braces may be omitted as well:

#include<stdio.h>  int main( void )  {    if(0xA)      if(052)          if('xeb')          if('12')                      printf("Hello World!") } 

All of which reduces to

int main( void )  {   printf("Hello World!") } 

A reasonably smart compiler won't bother generating the machine code for the if statements at all, and should generate machine code as though the program had been written as above.

</div
 
 

関連する質問

-1  Excelのフォーミュラの場合は、複雑なものをデバッグできますか?  ( How can i debug my complex if excel formula ) 
私は学校の先生で、私の学校の評価システムを開発しています。この式を修正するためにどうすればいいですか? <コード> =IF(H3="SUR",IF(Subject!C3<2.7,"Not on track",IF(Subject!C3<=3.29,"On t...

100  ASPXページの場合  ( If statement in aspx page ) 
私のサイトに基本的なIF文を書いて、変数がtrueに設定されているかどうかに応じて項目1または項目2のどちらかを表示するように書いてください。 私は.NETには慣れていないため、ASPXページで作業するIFステートメントを取得する方法の基本的な構造で少しヘルプ...

1  vba-ステートメントの場合 - エラー10  ( Vba nested if statements error 10 ) 
私の単純なVBAコードに問題があります。 ステートメント(セルに含める必要がある場合)は、複数のネストされたIFステートメント(セルに含める必要があります)がありますが、1004エラーが発生しました - アプリケーション定義またはオブジェクトエラーです。 問題...

-2  Python "Stack Overflow"(ステートメントの場合は104)。 DEF(x)コードを最適化するための唯一の解決策はありますか?  ( Python stack overflow 104 if statements is defx the only solution to opti ) 
今日は、パスディレクトリ名でファイルをチェックしようとしました。 以前は104の場合は104の場合は作成しようとしました。 このオーバーフローエラーを廃棄する方法 より具体的な質問:DEF(X)は、Pythonでそのような場合を最適化するための唯一の解決策を...

0  明示的または暗黙の実行制御ステートメントの使用  ( Explicit or implicit execution control statement use ) 
私は時々を使う <事前> <コード> SetWindowRgn1 他の時代を使う <事前> <コード> SetWindowRgn2 2人は同等です、私は知っていますが、私はどちらが最高であるかどうかわからない。 ブレーキや続行などの他の実行制御ステートメ...

3  ステートメントスピードの場合jQuery / JavaScript  ( Jquery javascript if statement speed ) 
与えられた: <事前> <コード> var isIE = $.browser.msie && !$.support.opacity, isIE6 = isIE && $.browser.version < 7; どちらが速くなります: <事前> <コード...

31  JavaScript - DIVに単語が含まれているか確認してください。  ( Javascript check if div contains a word ) 
DIVに特定の単語が含まれているかどうかを確認できますか? <事前> <コード> var divs= document.getElementsByTagName('div'); for (var i = 0, len = divs.length; i < l...

100  IIF()とIFのパフォーマンス差  ( Performance difference between iif and if ) 
Visual Basicでは、<コード> If ステートメントの代わりに<コード> IIf 機能を使用する場合の性能差がありますか? ...

0  シリーズの真理値はあいまいです。このエラーを解決する方法[複製]  ( The truth value of a series is ambiguous how do i fix this error ) 
この質問はすでにここで回答を持っています シリーズの真理値はあいまいです。 a.Empty、a.bool()、a.item()、a.any()またはa.all()を使用してください。 ...

0  jQuery "またはIF"ステートメント  ( Jquery or if statement ) 
コンテナに無効なフォームフィールドがあるかどうかを確認する関数があります。それが特定のコンテナを示すリンクにある場合は、「Haserrors」クラスが追加されています。 <事前> <コード> function treatFormLinks () { i...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有